我需要设置属性以便在new和edit动作中有一个关联,所以我有这个:
产品型号
has_one :store
accepts_nested_attributes_for :store
形式
= form_tag @product do |f|
= f.fields_for :store do |store_fields|
= render 'store_form', :f => store_fields
控制器中的
params.require(:存储).permit(:存储)!.permit
字段显示,但是当我提交表单时,它没有意义,商店关联是空的。如何解决问题?
UPD
params.require(:product).permit(store_attributes: [:store_id, :supplier_id, :margin, :discount]).permit!
日志:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "product"=>{"name"=>"qwefqwefasdf", "description"=>"", "permalink"=>"asdf", "store_attributes"=>{"margin"=>"123", "discount"=>"123"}}, "button"=>"", "id"=>"asdf"}
答案 0 :(得分:19)
开,正确的答案是
变化
= f.fields_for :store do |store_fields|
到
= f.fields_for :store, @vendor.store do |store_fields|
答案 1 :(得分:5)
你能从服务器端复制并粘贴params的样子吗?
13:44:29 INFO: Parameters: {"utf8"=>"✓" .......
这将有助于正确命名params
如果params命名正确但未被接受,则尝试明确指定
params.permit(:product => [:something, :stores_attributes => [:name, :address ]])
params.permit(:product => [ :name, :description, :permalink, :store_attributes => [:store_id, :supplier_id, :margin, :discount]])
http://edgeapi.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit
答案 2 :(得分:0)
假设有问题的控制器是ProductsController
,则您的强参数定义不正确。
尝试:
params.require(:product).permit(:store_attributes)
或者,更严格一点,只允许所需的属性:
params.require(:product).permit(store_attributes: [ :store_field1, :store_field2 ])
:store_field1
和:store_field2
是store
模型中属于您form
并且您想要允许的属性。
<强>更新强>
以下内容应根据您的日志输出而有效。
params.require(:product).permit(:name, :description, :permalink, store_attributes: [ :margin, :discount ])
答案 3 :(得分:0)
查看控制台中的参数。你应该看到类似的东西:
{ "product" => { "store_attributes" => { } }
这意味着您想要require
:product(您需要产品参数)并允许商店使用正确的属性。
params.require(:product).permit(:store_attributes => [ :name, :location, :etc ])
当你需要(:store)时,这意味着你期望在参数哈希的根目录中存在“存储”键,但情况并非如此(以及为什么你的关联是空的。)