投稿された各記事に対してコメントを投稿する機能を追加します。
投稿された記事に対してコメントを入力できるようにします。
さきほどroutesファイルに
resources :comments
と追加したので、各アクションやURIパターン、パスは作成されています。
しかし、モデルとの仲介をしてくれるコントローラが必要です。
<strong>$ rails g controller comments</strong>
ここで注意してほしいのはRailsの命名ルールです。
Railsではモデルの名前は単数形、コントローラの名前は複数形で命名しなさいというルールがあります。
ではコマンドを実行して、controllerを作成します。
コメントを投稿する為のフォームを作成します。
articleの際の流れを思い出してください。
articleを投稿するためにnewやcreateアクションに飛ぶと、必ずtemplate missingというアクションに対応したviewファイルがありませんよ!とエラーがでていましたね。
しかし、今回のコメントに関しては専用のviewファイルは必要ありません。
なぜかというと、コメントは、投稿された記事に対して入力される為、記事が表示されている画面にコメントの入力欄がなくてはいけないからです。
つまり、articleのviewファイル(app/views/articles/show.html.erb
)にコメントのフォームコードを追加して、コメントの入力欄を作成すれば良いのです。
viewファイルに以下のコードを追記して保存してください。
<meta charset="utf-8">
<%= form_with(model: [ @article, @article.comments.build ], local: true) do |form| %>
<p>
<%= form.label :commenter %><br>
<%= form.text_field :commenter %>
</p>
<p>
<%= form.label :text %><br>
<%= form.text_area :text %>
</p>
<%= form.submit %>
<% end %>
ここまででコメントの投稿フォームができました。
コメントを入力して投稿すると
Unknown action
The action 'create' could not be found for CommentsController
createアクションがありせんよ!というエラーが表示されます。
ではcomments.controllerファイルにcreateアクションを追加しましょう。
def create
@article = Article.find(params[:id])
@comment = @article.comments.create(comment_params)
end
投稿フォームからコメントを投稿し、データを保存することができるようになりました。
しかし投稿されたコメントは表示されていません。
articleの場合は、投稿したarticleの一覧を表示するindex.html.erbや詳細を表示するshow.html.erbが必要でした。
繰り返しになりますが、コメントは記事に対して入力したものです。
その為、記事詳細画面(app/views/articles/show.html.erb)にコメントが表示されるようにコードを追加します。
以下のコードを追記して保存してください。
<% @article.comments.each do |comment| %>
<%= comment.commenter %>
<%= comment.body %>
<% end %>
このコードも繰り返し処理です。
記事に対して投稿されたコメントは1件とは限りません。
そこですべてのコメントが表示されるようにeachをつかいます。
無料ビデオ講座のお知らせ
Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。