0

次の場合に、複数のネストされた属性のフォームとアクションを作成する方法:

ラインアイテム:

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)

Accepts_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。同様の質問Rails3.2has_manyフォームの送信 これはフォームです:

4

1 に答える 1

1

この行に見えます:

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

パラメータproduct_option_idは外側のline_itemハッシュであり、内側になります。たぶん、次のように select を書く必要があります:

<%= select_tag "line_item[product_option_id]", options_from_collection_for_select(o.product_options.where(:product_id => @product.id), :id, :value) %>

よくわかりませんが、多分これです。失敗している正確な行など、もっと情報が必要かもしれません。


さらに、モデル名は同じで、これらのforeign_keyを使用するため、:foreign_key => "line_item_id"とは必要ありません。アピから。:foreign_key => "product_option_id"belongs_to

関連付けに使用する外部キーを指定します。デフォルトでは、これは「<strong>_id」サフィックスが付いた関連付けの名前であると推測されます。したがって、**belongs_to :person**関連付けを定義するクラスは、「<strong>person_id」をデフォルトの:foreign_keyとして使用します。同様に、belongs_to :favorite_person, :class_name => "Person"は "<strong>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) %>

これはうまくいくはずです、私は思います:) ...

于 2012-11-05T12:57:40.807 に答える