コメントのフォーム作成

前回のようにcommentリソースがboardsリソースにネストされている

ルーティングの場合、コメント作成はfomr_wtihにboardモデルとcommentモデルと複数モデルを渡すことでフォームデータの送信先を指定できる

今回は、掲示板詳細画面にコメントのフォームをパーシャルで埋め込むので、boardsコントローラのshowアクションに

def show
    @board = Board.find(params[:id])
    @comment = Comment.new
    @comments = @board.comments.includes(:user).order(created_at: :desc)
 end

と、URLのid情報を持ったBoardモデルのインスタンス、空のcommentモデルのインスタンス、ユーザー情報に関連づいたcommentモデルの集合を降順で取得  

コメントフォームのパーシャルはshow.html.erbに  

<% render ‘comments/form’ , { board: @board, comment: @comment } %>

を記述して呼び出し、この時パーシャル内でboard変数には@boardインスタンスcomment変数には@commentインスタンスを指定  

今回はどの掲示板(boardオブジェクト)に関連づいたコメント(commentオブジェクト)をデータベースに保存するため、form_withメソッドの引数にmodel: オプションにboardオブジェクトとcommenntオブジェクトを渡す必要があるので

<%= form_with model: [board, comment], local: true do |form| %>

と記述

modelにboardオブジェクトと、それに関連付いたcommentオブジェクトを渡すことで、rails側が自動的にcommentオブジェクトが空かどうかを判定して、空なら、boards/id/commentsのURLを指定、createアクションを呼び出し、中身がある場合、boards/id/comments/idのURLを指定、updateアクションを呼び出している。今回の場合showアクションでboardsインスタンスはurlのid情報が、commentインスタンスは空なので、送信先はboards/:id/comments、つまりcommentアクションのcreateアクションにフォームデータが送られる

 

参考文献

【Rails】form_withの使い方を徹底解説! | Pikawaka - ピカ1わかりやすいプログラミング用語サイト

  【Rails】form_with/form_forについて【入門】 - Qiita

ネストしているモデルに対するform_withの書き方 - Qiita