2

我正在使用 Rails 3.2 和 Ruby 1.9.3。

我知道这已经被一次又一次地问过,但我找不到任何关于我的特殊情况的东西,即使这肯定是非常愚蠢的事情,我也无法弄清楚。

我的关系是这样的:一个产品有很多类别,一个类别有很多属性。

我想在我的视图中创建一个嵌套表单,所以我正在使用

= f.fields_for :categories do |category|
      = render 'category_fields', :f => category

为了将类别字段“附加”到产品表单。

问题是,当它转换为 HTML 时,类别输入的名称是“categories_attributes”,如下所示:

<label for="product_categories_attributes_0_name">Name</label>
<input id="product_categories_attributes_0_name" type="text" size="30" name="product[categories_attributes][0][name]">

我是 Rails 新手,但我想它应该是product[categories][0][name]而不是categories_attributes.

提交表格后,我得到

Can't mass-assign protected attributes: categories_attributes

另外,我的模型:

class Product < ActiveRecord::Base
  belongs_to :company
  belongs_to :product_type

  has_many :categories, :dependent => :destroy
  accepts_nested_attributes_for :categories

  attr_accessible :comments, :name, :price
end

class Category < ActiveRecord::Base
  belongs_to :product
  has_many :attributes, :dependent => :destroy
  attr_accessible :name

  accepts_nested_attributes_for :attributes
end

class Attribute < ActiveRecord::Base
  belongs_to :category

  attr_accessible :name, :value
end

我绝对确定这只是一个小错误,但我无法发现它。

帮助?

4

1 回答 1

6

categories_attributes添加到 Product 中的attr_accessible调用中:

attr_accessible :categories_attributes, :comments, :name, :price

attributes_attributes添加到类别中的attr_accessible调用中:

attr_accessible :name, :attributes_attributes

更新:

这里发生了三件事,我不确定哪一件你不能解决。

在您的 Product 模型中使用accept_nested_attributes_for :categories会向您的模型添加categories_attributes=(attributes)方法,并允许您通过父级将属性保存在关联记录上(通过关联_attributes hash 传递它们)。

这一切都是因为当您在表单中使用 fields_for 帮助器时如何构建params哈希。

更简单的例子:

class Product < ActiveRecord::Base
  has_many :categories
  accepts_nested_attributes_for :categories

  attr_accessible :categories_attributes, :name
end

如果您通过此表单创建产品:

<%= form_for @product do |f| %>
  Name: <%= f.text_field :name %>

  <%= f.fields_for :categories do |c| %>
    <%= c.text_field :name %>
    <%= c.text_field :desc %>
  <% end %>

 <%= f.submit %>
<% end %>

您的参数哈希将包括:

{ :product => { :name => 'Tequila', :categories_attributes => { :name => 'essentials', :desc => 'i need more of it' } } }

或简化:

{ :product => { :name => 'Tequila', :categories_attributes => { ... } } }

在您的控制器中创建产品时:

@product = Product.new(params[:product])

您将:name => 'Tequila', :categories_attributes => { ... }哈希传递给 Product.new。您正在向它传递两个参数:name:categories_attributes。Rails 安全性要求您将所有传递给新的参数的参数列入白名单,使用attr_accessible行创建方法。当你省略:categories_attributes时, rails 会抱怨:

Can't mass-assign protected attributes: categories_attributes

让我知道这是否可以清除所有内容。

更多关于嵌套属性

更多关于fields_for

更多关于批量分配

于 2013-03-18T23:56:20.677 回答