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を用いていないのは今後実装する内容に関わってくるため。