gpt4 book ai didi

ruby-on-rails - 无法在 Rails 中为不存在的模型批量分配 protected 属性

转载 作者:数据小太阳 更新时间:2023-10-29 08:23:48 25 4
gpt4 key购买 nike

我正在使用 Rails 3.2 和 Ruby 1.9.3。

我知道这个问题已经被问过一次又一次,但我找不到任何关于我的具体情况的信息,即使这肯定是一些非常愚蠢的事情,我也想不通。

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

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

= 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

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

帮忙吗?

最佳答案

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

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

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

attr_accessible :name, :attributes_attributes

更新:

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

在您的 Product 模型中使用 accepts_nested_attributes_for :categoriescategories_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 => { ... } } }

当您在 Controller 中创建产品时:

@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

让我知道这是否清除了一切。

更多关于 Nested Attributes

更多关于 fields_for

更多关于 Mass assignment

关于ruby-on-rails - 无法在 Rails 中为不存在的模型批量分配 protected 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15488856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com