Rails 3.2:来自一个模型的多个嵌套数据

时间:2012-11-05 11:38:02

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

如果符合以下条件,如何为多个嵌套属性创建表单和操作:

的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 形式如下:

1 个答案:

答案 0 :(得分:1)

看起来这一行:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"/WM5/MqPn1yCxjKWoJQmjfko2pR4RiYV0S2KeTTpA3w=", "line_item"=>{"product_id"=>"1"}, "product_option_id"=>"5", "commit"=>"add"}

参数product_option_idline_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) %>

这应该有效,我认为:)......