Ruby on rails 3 Can';t mass assign protected attributes,但使用attr_accessible

Ruby on rails 3 Can';t mass assign protected attributes,但使用attr_accessible,ruby-on-rails-3,mass-assignment,Ruby On Rails 3,Mass Assignment,我得到以下错误: 无法批量分配受保护的属性:管理员、学生 使用以下seed.rb文件运行rake db:seed命令时: 我的模型看起来像: class SecurityUsersRole < ActiveRecord::Base # Accessible columns attr_accessible :description, :role # Relationships ... # Validations validat

我得到以下错误:

无法批量分配受保护的属性:管理员、学生

使用以下seed.rb文件运行rake db:seed命令时:

我的模型看起来像:

class SecurityUsersRole < ActiveRecord::Base

  # Accessible columns
  attr_accessible :description,
                  :role

  # Relationships
  ...

  # Validations
  validates :description, presence: true, length: { in: 4..32 }, uniqueness: true
  validates :role, length: {  maximum: 256 }, presence: true

end
关于这一点有很多问题,答案总是设置字段的attr_accessible,但我已经做过了

编辑:

如果使用以下语法({}而不是[]),则添加第一对:

roles = {
    Admin: 'Unlimited Access',
    Student: 'Default user role for each user created by sign-in interface.'
}
如果我这样做,一切都不会改变:

SecurityUsersRole.find_or_create_by_role_and_description('Admin','Unlimited Access')
SecurityUsersRole.find_or_create_by_role_and_description('Student','Default user role for each user created by sign-in interface.')
经过一番阅读,助手的查找或创建似乎已经完成 在Rails 4.0中。我正在使用Rails 3.2,但也决定尝试其他技术:

roles = {
    Admin: 'Unlimited Access',
    Student: 'Default user role for each user created by sign-in interface.',
    Test:'wtf'
}

roles.each do |role, description|
  SecurityUsersRole.where(role:role,description:description).first_or_create
  #puts role
  #puts description
end
上面的语句仍然只创建第一条记录。我决定在rails控制台中执行该语句,这是我得到的输出:

  SecurityUsersRole Load (5.0ms)  SELECT security_users_roles.* FROM security_users_roles WHERE security_users_roles.role = 'Admin' AND security_users_roles.description = 'Unlimited Access' FETCH FIRST ROW ONLY
  SecurityUsersRole Load (3.0ms)  SELECT security_users_roles.* FROM security_users_roles WHERE security_users_roles.role = 'Student' AND security_users_roles.description = 'Default user role for each user created by sign-in interface.' FETCH FIRST ROW ONLY
  SecurityUsersRole Exists (1.0ms)  SELECT 1 AS one FROM security_users_roles WHERE security_users_roles.description = 'Default user role for each user created by sign-in interface.' FETCH FIRST ROW ONLY
  SecurityUsersRole Load (1.0ms)  SELECT security_users_roles.* FROM security_users_roles WHERE security_users_roles.role = 'Test' AND security_users_roles.description = 'wtf' FETCH FIRST ROW ONLY
  SecurityUsersRole Exists (1.0ms)  SELECT 1 AS one FROM security_users_roles WHERE security_users_roles.description = 'wtf' FETCH FIRST ROW ONLY
=> {:Admin=>"Unlimited Access", :Student=>"Default user role for each user created by sign-in interface.", :Test=>"wtf"}
我无法理解到底发生了什么,但是从控制台选择所有用户只会返回第一个用户。那么,如果搜索其他角色,为什么不创建它们,因为它们不存在


有人能告诉我可以尝试什么吗?

问题是由我的模型验证规则引起的,其中

  # Validations
  validates :description, presence: true, length: { in: 4..32 }, uniqueness: true
  validates :role, length: {  maximum: 256 }, presence: true
应该是

  # Validations
  validates :role, presence: true, length: { in: 4..32 }, uniqueness: true
  validates :description, length: {  maximum: 256 }, presence: true
我已更改:角色和:描述字段的位置。因此,rake db:seed命令插入第一条记录,但第二条记录出现错误,插入被中止。结果是我总是导入第一条记录

为了在使用seed时获得验证错误,应该使用!方法版本如下:

def signup
  params[:user] # => {:name => “ow3ned”, :admin => true}
  @user = User.new(params[:user])
end
SecurityUsersRole.where(role:role,description:description).first_or_create!

尝试按如下方式设置角色哈希:
roles={Admin:'Unlimited',Student:'Default'}
。也就是说,使用大括号而不是方括号,否则数组中会有一个哈希。@mmichael如果我使用{}方括号,则只插入第一对键值。这就是为什么我尝试在数组中保存值。
SecurityUsersRole.where(role:role,description:description).first_or_create!