コメントのフォーム作成
前回のように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わかりやすいプログラミング用語サイト