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使う