Rails 3嵌套属性和访问关联属性

时间:2012-01-18 10:27:08

标签: ruby-on-rails-3 associations nested-attributes

我有以下情况: 产品可以由不同的供应商以给定的价格出售。 在我的产品形式中,我想通过复选框选择提供商 为所选提供商分配价格。

我的模特:

product.rb

class Product < ActiveRecord::Base
  belongs_to :price
  has_many :providers, through: :price

  accepts_nested_attributes_for :providers, :price
end

# == Schema Information
#
# Table name: products
#
#  id         :integer         not null, primary key
#  name       :string(255)
#  isbn       :integer
#  created_at :datetime        not null
#  updated_at :datetime        not null

provider.rb

class Provider < ActiveRecord::Base
  belongs_to :price
  has_many :products, through: :price
end

# == Schema Information
#
# Table name: providers
#
#  id         :integer         not null, primary key
#  name       :string(255)
#  created_at :datetime        not null
#  updated_at :datetime        not null

price.rb

class Price < ActiveRecord::Base
  belongs_to :product
  belongs_to :provider
end

# == Schema Information
#
# Table name: prices
#
#  id          :integer         not null, primary key
#  value       :decimal(, )
#  created_at  :datetime        not null
#      updated_at  :datetime        not null
#  product_id  :integer
#  provider_id :integer

应用/视图/产品/ _form.html.erb

<%= form_for(@product) do |f| %>
...
<div class="field">
    <% Provider.all.each do |provider| %>
      <%= check_box_tag "product[provider_ids][]", provider.id, @product.provider_ids.include?(provider.id), id: dom_id(provider) %>
          <%= label_tag dom_id(provider), provider.name %>
    <% end %>

    <% f.fields_for :price do |price_form| %>
      <%= price_form.text_field :value %>
    <% end %>
    <br>
</div>
...

我没有更改products_controller中的任何内容。 我尝试通过表单中的以下代码访问关联属性price.value。

<%= f.fields_for :price do |price_form| %>
    <%= price_form.text_field :value %>
<% end %>

但是复选框附近没有显示text_field,当我选择一个提供者并提交表单时,我收到以下错误:

can't write unknown attribute `price_id'

2 个答案:

答案 0 :(得分:1)

将Product类中的belongs_to :price更改为has_one :price。您应该在表格中包含belongs_to :attribute的模型上使用attribute_id方法。

答案 1 :(得分:0)

您需要更改

<% f.fields_for :price do |price_form| %>
    <%= price_form.text_field :value %>
<% end %>

<%= f.fields_for :price do |price_form| %>
    <%= price_form.text_field :value %>
<% end %>