对于不存在的模型,无法在Rails中为受保护的属性进行大量分配

时间:2013-03-18 23:26:46

标签: ruby-on-rails ruby

我正在使用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

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

帮助?

1 个答案:

答案 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

如果这清除了一切,请告诉我。

更多关于Nested Attributes

更多关于fields_for

更多关于Mass assignment