has_one关联的嵌套属性

时间:2013-12-19 18:53:28

标签: ruby-on-rails ruby-on-rails-3

我需要设置属性以便在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"}

4 个答案:

答案 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_field2store模型中属于您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)时,这意味着你期望在参数哈希的根目录中存在“存储”键,但情况并非如此(以及为什么你的关联是空的。)