对于nested_attributes,获取“无法为受保护的属性进行大量分配:”

时间:2013-06-06 05:47:31

标签: ruby-on-rails ruby-on-rails-3 nested-attributes mass-assignment attr-accessible

我在Rails3上,我有两个模型,User和Post。用户将帖子作为嵌套属性。当我尝试保存用户然后我得到无法批量分配受保护的属性:.....

3 个答案:

答案 0 :(得分:1)

在帖子模型中试用attr_accessible

http://railscasts.com/episodes/26-hackers-love-mass-assignment

答案 1 :(得分:0)

如果模型定义如下:

user.rb

class User < ActiveRecord::Base
  attr_accessible  :name, :posts_attributes
  has_many :posts
  accepts_nested_attributes_for :posts
end

post.rb

class Post < ActiveRecord::Base
  attr_accessible :title, :content :user_id
end
那么一切都应该没问题。您可以使用帖子将用户保存为嵌套属性。

以下是初学者的示例代码:)

https://github.com/railscash/sample_change_user_role

答案 2 :(得分:0)

Mass Assignment是Rails为使用参数哈希构造对象的行为赋予的名称。它是“质量分配”,因为您通过单个赋值运算符为属性分配多个值。

以下代码段执行Post模型的名称和主题属性的批量分配:

Post.new(:name => "John", :topic => "Something")
Post.create(:name => "John", :topic => "Something")
Post.update_attributes(:name => "John", :topic => "Something")

为了使其正常工作,您的模型必须允许为您传入的哈希中的每个属性进行质量分配。

有两种情况会失败:

您有一个attr_accessible声明,其中不包含:name

您有一个attr_protected,其中包含:name

最近,默认情况下,属性必须通过attr_accessible手动列入白名单才能成功进行质量分配。在此之前,默认情况下属性是可分配的,除非它们明确地列在黑名单attr_protected或任何其他属性在白名单中使用attr_acessible。