コメント登録機能の追加 - (2)コメントの追加・削除
このセクションでは「コメント登録機能の追加 - (1)コメントの表示」に続いて、記事にコメントを追加・削除する機能を実装する手順を解説します。
<チュートリアルを進めるにあたって>
・アプリケーション名は"blog"、アプリケーションのルートフォルダは、"c:¥rails_apps¥blog"とします
・アプリケーションのルートフォルダのパスは、"RAILS_ROOT"と記載します
・コマンドプロンプトを用いた操作は、特別な指定がない限り全て"RAILS_ROOT"に移動した状態で行います
コメントの追加・削除機能の追加
コメントの追加・削除機能を「コメント登録機能の追加 - (1)コメントの表示」で作成したコメント一覧画面に対して追加します。この画面をWebブラウザ上で表示し、コメントの追加(登録)操作をすると、サーバ側ではコメントのコントローラ(※)のcreateメソッドが自動的に実行されます。コメントの削除操作をすると、destroyメソッドが実行されます。
※コメントのコントローラは、次の手順で作成します。
ビューへのコメント登録欄と削除ボタンの実装
「コメント登録機能の追加 - (1)コメントの表示」で作成したコメント一覧画面のビュー "RAILS_ROOT\app\views\home\page.html.erb"に、「コメントの削除リンク」と「コメント登録欄」を追加します。以下のように実装します。
<div style="width:500px;border:1px solid #ccc;margin:5px">
<div style="float:left">
<h2 ><%= @article.title %></h2>
</div>
<div style="clear:both">
<pre><%= @article.content %></pre>
</div>
<h3>コメント:</h3>
<% @article.comments.each do |comment| %>
<h4><%= comment.from %> さん</h4>
<pre><%= comment.body %></pre>
+ <p>[<%= link_to 'コメントを削除する', [@article, comment],
+ confirm: 'Are you sure?', method: :delete %>]</p>
<% end %>
+ <h3>コメント追加:</h3>
+ <%= form_for [@article, @comment] do |f| %>
+ <p>from:</p><p><%= f.text_field :from %></p>
+ <p>comment:</p><p><%= f.text_area :body, :rows => 5 %></p>
+ <%= f.submit 'コメントを投稿する' %>
+ <% end %>
<div style="float:right">
<%= link_to 'トップページに戻る', root_path %>
</div>
</div>
※行頭に"+"がついた行が追加したコードです。
コメント登録欄で使用するインスタンス変数「@comment」の設定
上記ビュー("RAILS_ROOT\app\views\home\page.html.erb")のインスタンス変数@commentを準備するため、「コメント登録機能の追加 - (1)コメントの表示」で作成した「HomeController#page」メソッドでCommentクラスの空のインスタンスを生成しておきます。
class HomeController < ApplicationController
def index
@articles = Article.all
end
def page
@article = Article.find(params[:id])
+ @comment = Comment.new
end
end
※行頭に"+"がついた行が追加したコードです。
コメントの登録・削除に用いるコントローラーの作成
コメントの追加・削除のための処理を実装するコントローラを作成します。
コマンドプロンプトで「rails generate controller comments」とタイプしてEnterキーを押下します。コマンドプロンプト上には、ファイル・フォルダが自動生成される様子が以下のように表示されます。
c:\rails_apps\blog>rails generate controller comments
create app/controllers/comments_controller.rb
invoke erb
create app/views/comments
invoke test_unit
create test/functional/comments_controller_test.rb
invoke helper
create app/helpers/comments_helper.rb
invoke test_unit
create test/unit/helpers/comments_helper_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/comments.js.coffee
invoke scss
create app/assets/stylesheets/comments.css.scss
コメントの追加・削除処理の実装
上記で作成したコントローラー、"RAILS_ROOT\app\controllers\comments_controller.rb"にあるCommentsControllerクラスに、データベース内のコメントを追加する機能(createメソッド)、削除する機能(destroyメソッド)を以下のように実装します。redirect_toは指定したURLやアクションにリダイレクトさせるメソッドです。
class CommentsController < ApplicationController
+ def create
+ @article = Article.find(params[:article_id])
+ @comment = @article.comments.create(params[:comment])
+ redirect_to page_path(params[:article_id])
+ end
+ def destroy
+ Comment.destroy(params[:id])
+ redirect_to page_path(params[:article_id])
+ end
end
※行頭に"+"がついた行が追加したコードです。
ルーティング設定
上記でコントローラに追加した機能のルーティング定義のため、"RAILS_ROOT\config\routes.rb" を以下のように変更します。"
記事データ:コメントデータ(1:N) の関連付けを意識して、RESTfulなURLを用いるため定義をネストして記述します。
Blog::Application.routes.draw do
- resources :articles
+ resources :articles do
+ resources :comments, :only => [:create, :destroy]
+ end
get "home/index"
match "page/:id" => 'home#page', :as => 'page'
:
以下略
※行頭に"-" が付いた行が削除したコードです。
※行頭に"+" が付いた行が追加したコードです。
コメント追加・削除の確認
アプリケーションを起動して、トップページから記事のタイトルをクリックして画面に遷移すると、以下の画面のように"コメントを削除するためのリンク"や"コメントを追加するための入力フォーム"が表示されます。実際にコメントの削除や追加を行うことができます。
(記事ごとにコメントを一覧表示する画面 : コメント追加・削除の確認)
「リファクタリングと入力チェック機能の追加」に続きます。