如果符合以下条件,如何为多个嵌套属性创建表单和操作:
的LineItem:
has_many :item_options, :dependent => :destroy
has_many :product_options, :through => :item_options
ProductOption:
belongs_to :product
belongs_to :option
has_many :item_options
has_many :line_items, :through => :item_options
ItemOption:
attr_accessible :line_item_id, :product_option_id
belongs_to :line_item, :foreign_key => "line_item_id"
belongs_to :product_option,:foreign_key => "product_option_id"
当我创建新的LineItem时,我需要创建新的ItemOption。这是我的表格:
<%= form_for(LineItem.new) do |f| %>
<%= f.hidden_field :product_id, value: @product.id %>
<%= f.fields_for :item_options do |io| %>
<% @product.options.uniq.each do |o| %>
<%= o.name %>:
<%= io.collection_select :product_option_id, o.product_options.where(:product_id => @product.id), :id, :value %>
<% end %>
<%= f.submit %>
<% end %>
当我点击添加到购物车时,我得到:
ItemOption(#70296453751440)预期,得到阵列(#70296430421140)
将Until_nested_attributes_for:item_options添加到LineItem时,我选择不显示:(
用
<%= select_tag "product_option_id", options_from_collection_for_select(o.product_options.where(:product_id => @product.id), :id, :value) %>
#item_options not created:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"/WM5/MqPn1yCxjKWoJQmjfko2pR4RiYV0S2KeTTpA3w=", "line_item"=>{"product_id"=>"1"}, "product_option_id"=>"5", "commit"=>"add"}
最后一个,我创造了这样的行动:
@line_item = LineItem.new(params[:line_item])
@line_item.item_options.build
....
我哪里错了? :(我完全糊涂了。 PS。类似的问题Rails 3.2 has_many through form submission 形式如下:
答案 0 :(得分:1)
看起来这一行:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"/WM5/MqPn1yCxjKWoJQmjfko2pR4RiYV0S2KeTTpA3w=", "line_item"=>{"product_id"=>"1"}, "product_option_id"=>"5", "commit"=>"add"}
参数product_option_id
在line_item
哈希之外,并且将在内部。也许你需要写这样的选择:
<%= select_tag "line_item[product_option_id]", options_from_collection_for_select(o.product_options.where(:product_id => @product.id), :id, :value) %>
我不确定,但也许就是这个。也许我需要更多的信息,比如失败的确切线。
额外,:foreign_key => "line_item_id"
和:foreign_key => "product_option_id"
不是必需的,因为belongs_to
模型名称相同并将使用这些foreign_key。来自api。
指定用于关联的外键。默认情况下这是 猜测是具有“ _id ”后缀的关联的名称。所以 定义
**belongs_to :person**
关联的类将使用 “ person_id ”作为默认:foreign_key 。同样, belongs_to :favorite_person,:class_name =&gt; “人”将使用外键 “的 favorite_person_id 强>”。
修改强>
很抱歉,unknown attribute: product_option_id
是因为属性名称是 product_option _ids,而且是一个数组,而不是唯一值。对于has_many
关系,列名称为 collection_singular _ids,而select应为:
<%= select_tag "line_item[product_option_ids][]", options_from_collection_for_select(o.product_options.where(:product_id => @product.id), :id, :value) %>
这应该有效,我认为:)......