ActiveModel :: MassAssignmentSecurity ::错误:无法批量分配受保护的属性:名称

时间:2012-07-02 11:58:01

标签: ruby-on-rails

当我尝试创建新用户时,

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: name
    from c:/RubyOnRails/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/
 activemodel-3.2.3/lib/active_model/mass_assignment_security/
 sanitizer.rb:48:in  `process_removed_attri
 butes'

3 个答案:

答案 0 :(得分:3)

一些事情:

批量分配通常意味着将属性传递给调用,该调用将对象创建为属性哈希的一部分。也就是说,您将哈希中的一堆属性传递给创建新对象的调用。例如:

@user = User.create({:name => "My name", :user_type => "nice_user"})

但是,Rails包含一些基本的安全规则,这些规则意味着默认情况下不能以这种方式分配所有属性。您必须事先指定哪些可以。你这样做:

class user < ActiveRecord::Base
  attr_accessible :name, :user_type
end

如果您没有指定属性为attr_accessible,并且您将其传递给创建对象,则会收到您发布的错误。

以下是更多详情:

http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html

另一种方法是在第一次创建记录时设置一些属性,然后在其后设置其他属性 - 如下所示:

# In this example `user_type` is not attr_accessible so it needs to be set specifically
@user = User.create({:name => "My name"})
@user.user_type = "nice_user"
@user.save

答案 1 :(得分:1)

如果您共享了模型代码,那将会有所帮助。

在您的模型文件中,将用户添加到attr_accessible

attr_accessible :name

答案 2 :(得分:1)

config/application.rb中,您有以下一行:

config.active_record.whitelist_attributes = true

在你的模特中,你错过了这一行:

attr_accessible :name

请勿更改配置文件,而是添加attr_accessible。您应该阅读http://guides.rubyonrails.org/security.html#mass-assignment以更好地了解质量分配安全问题。