routes/controllerへの追記(コメント機能の追加)
♡config/routes.rbへの追記
♡app/boards.controller.rbへの追記(詳細画面の追加)
♡app/comments.controller.rbの設定
①config/routes.rbへの追記(ネストする)
resources :boards, only: %i[index new create show] do
resources :comments, only: %i[create], shallow: true
shallowオプションを用いてcommentsをboardsを入れ子の形にする。
あくまでも浅いネストにするため、深いネストにならないよう、idを用いないアクションのみを親のスコープ下で生成する。
idを用いるアクション→show、edit、update、destroy等
②app/boards.controller.rbへの追記(詳細画面の追加)
showアクションの追記をする。
☆N+1問題を解消するため.includes(:user)
を追記する。
belongs_toやhas_manyでアソシエーションを組んでいるため、異なるテーブルから逐一データを取得してしまう。解消して無駄をなくす。
☆作成したコメントが降順で表示されるよう、.order(created_at: :desc)
を記入する。
desc = descendingの略。
def show
@board = Board.find(params[:id])
@comment = Comment.new
@comments = @board.comments.includes(:user).order(created_at: :desc)
end
③app/comments.controller.rbの作成
rails g controller comments
のコマンドでコントローラーを作成。
class CommentsController < ApplicationController
def create
comment = current_user.comments.new(comment_params)
if comment.save
redirect_to board_path(comment.board), success: t('.success')
else
redirect_to board_path(comment.board), danger: t('.fail')
end
end
private
def comment_params
params.require(:comment).permit(:body).merge(board_id: params[:board_id])
end
end
☆ストロングパラメーター
requireの引数 = モデル名
permitの引数 = カラム名
☆merge部分について
.merge(board_id: params[:board_id])
merge = 結合
board_id: params[:board_id]はルーティングをネストしており、URLにboard.idが含まれているため。
idはユーザーが記入しているわけではないが、作成している側がDBに保存しておきたいため、mergeを用いることで同時にboard.idについても保存することができるようにしている。
※コメント登録失敗時に、renderを用いていないのは今後実装する内容に関わってくるため。