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

ユーザーが投稿した記事(post)に対してコメント(comment)する想定

 

 comments_controller.rbの記述 
def new
@post = Post.find(params[:post_id]) ←現在の投稿のデータをインスタンスに入れておく
@comment = Comment.new         ←新規commentのインスタンス生成
end
 
def create
current_user.comments.create!(comment_params)
end

postモデルとcommentモデルの両方にデータを登録するためnewメソッドで両方の情報を呼び出しておく

※postモデルには「誰が」「どんなコメントを」

※commentモデルには「誰が」「どの投稿に」

 

ストロングパラメータの定義
private
def comment_params
params.require(:comment).permit(:title, :content , :image )
 
           .merge(user_id: current_user.id, post_id: params[:post_id])
end
 
.merge 

ユーザーが記入した情報の他に、記入していない裏の情報も一緒に保存したい時

今回の例では「現在ログイン中のユーザーID(current_user.id)」と「コメント先の投稿ID(params[:post_id])

 

 comments/new.html.erbの記述
<%= form_with model: [@post, @comment] do |f| %>
<p>タイトル<%= f.text_field :title %></p>
<p>本文<%= f.text_field :content %></p>
<p>イメージ画像<%= f.file_field :image %></p>
<%= f.submit "投稿" %>
<% end %>

※ネストしているモデルのDBへの書き込みの場合、form_with内で対象のモデルを複数記述しなければいけない

※今回は「@post」と「@comment」

 

参考

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

mergeメソッドについて改めて理解を深めた - Qiita