OKADA LABO

form_forとrequireメソッドとmerge

form_forとrequireメソッドとmerge

form_forに入力されたデータはparamsの中に以下のような形でコントローラーに送られます。

【例】
new.html.erb

<%= form_for(@book) do |f| %>
  <%= f.text_field :name %>
  <%= f.text_area :detail %>
<% end %>

ターミナル

params
# { book: { name: "入力された名前", detail: "入力された詳細" } }

キーはform_forの引数にあるインスタンスの モデル名(book) になり、バリューはカラム名と入力された値のハッシュです。
paramsからキーがbookのバリューを取得し、createアクションの引数に渡せるようにストロングパラメーターを定義するには以下のようにします。

form_forから送られてきたparamsでレコードを作る
reviews_controller.rb

class ReviewsController < RankingController
  def new
    @product = Product.find(params[:product_id])
    @review = Review.new
  end

  def create
    Review.create(create_params)
    redirect_to controller: :products, action: :index
  end

  private
  def create_params
    params.require(:review).permit(:nickname, :rate, :review).merge(product_id: params[:product_id])
  end
end

ターミナル
これを受け取る

> params
=> {"utf8"=>"✓",
 "authenticity_token"=>"pLmSAaYFwhtDzN/VO5yh3QTe1eM5cOT1H9yJ/EZf6Ho=",
 "review"=>{"nickname"=>"jack", "rate"=>"10", "review"=>"面白い"},
 "action"=>"create",
 "controller"=>"reviews",
 "product_id"=>"1"}

product_idはform_forの”review”で送られてないからmerge使う