我正在使用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
我绝对肯定这只是一个小错误,但我无法发现它。
帮助?
答案 0 :(得分:7)
将 categories_attributes 添加到产品中的 attr_accessible 电话:
attr_accessible :categories_attributes, :comments, :name, :price
将 attributes_attributes 添加到类别中的 attr_accessible 电话:
attr_accessible :name, :attributes_attributes
<强>更新强>
这里发生了三件事我不确定你无法解决哪一件事。
在产品模型中使用 accepts_nested_attributes_for:categories 会将 categories_attributes =(attributes)方法添加到模型中,并允许您通过父级保存关联记录的属性(通过传递)他们通过 association _attributes hash)。
这一切都发生在你在表单中使用fields_for helper时如何构建 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 %>
你的params哈希包括:
{ :product => { :name => 'Tequila', :categories_attributes => { :name => 'essentials', :desc => 'i need more of it' } } }
或简化:
{ :product => { :name => 'Tequila', :categories_attributes => { ... } } }
在您的控制器中,您正在创建产品:
@product = Product.new(params[:product])
你的传递:name =&gt; '龙舌兰酒',:categories_attributes =&gt; {...} 哈希到Product.new。您将两个参数传递给:名称和:categories_attributes 。 Rails安全性要求您将所有传递给new的参数列入白名单,使用 attr_accessible 行创建方法。如果省略:categories_attributes ,rails会抱怨:
Can't mass-assign protected attributes: categories_attributes
如果这清除了一切,请告诉我。
更多关于fields_for
更多关于Mass assignment