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で扱えるようにしている。
この記事が気に入ったらサポートをしてみませんか?