Railsアプリ実装 コメント投稿機能で躓きがちなところまとめ(自分メモ)

1. ルーティングのネスト

Rails.application.routes.draw do
  resources :親となるコントローラー do
    resources :子となるコントローラー
  end
end
Prefix Verb           URI Pattern                            Controller#Action
# 中略
tweet_comments POST   /tweets/:tweet_id/comments(.:format)   comments#create
# 中略

ルーティングをネストさせる一番の理由は、アソシエーション先のレコードのidをparamsに追加してコントローラーに送るため

2. 元の投稿記事のコントローラーへの記述

例えば、tweets_controller.rb

  def show
    @comment = Comment.new
    @comments = @tweet.comments.includes(:user)
  end

tweets/show.html.erbでform_withを使用して、comments#createを実行するリクエストを飛ばしたいので、@comment = Comment.newというインスタンス変数を生成しておくこと!

tweetsテーブルとcommentsテーブルはアソシエーションを組んでいるので、@tweet.commentsとすることで、@tweetへ投稿されたすべてのコメントを取得できる。

ビューでは誰のコメントか明らかにするため、アソシエーションを使ってユーザーのレコードを取得する処理を繰り返す。
そのときに「N+1問題」が発生してしまうので、includesメソッドを使って、N+1問題を解決している。

3. ビューへの記述

<% @comments.each do |comment| %>
  <p>
    <%= link_to comment.user.nickname, "/users/#{comment.user_id}" %>
    <%= comment.text %>
   </p>
 <% end %>

@commentsには複数のコメントのレコードが入っているので、配列の形をとる。そのため、ビューに表示させるためにはeachメソッドを使って、ひとつひとつのレコードに分解してから表示させる。
※ このとき<%= %>で囲んでしまうと配列の中身が表示されてしまうので<% %>で囲むこと!

コメントしたユーザーの名前をクリックしたら、そのユーザーのマイページへ遷移する。そのために、名前のところへlink_toメソッドを使ってリンクを作成している。
ユーザーのidはcomment.user_idとパスに記述することで、コメントを投稿したユーザーのidをparamsで扱えるようにしている。


この記事が気に入ったらサポートをしてみませんか?