具有用户权限的ActiveRecord角色

时间:2012-08-21 20:34:30

标签: ruby-on-rails ruby-on-rails-3 activerecord mass-assignment

如果我误解了任何东西,那么相当新的轨道,请原谅我。我有一个如下所示的用户模型。理想情况下,我想做的是让普通用户只能更新他们的密码,但让管理员能够更改他们的用户名,电子邮件等......

class User < ActiveRecord::Base
  # Default auths
  attr_accessible :password, :password_confirmation, :remember_me
  # Admin auths
  attr_accessible :login, :username, :email, :password, :password_confirmation, :remember_me, :role_ids, :as => :admin
end

要以管理员身份更新记录,请执行以下操作:

@user.update_attributes(params[:user], :as => :admin)

但是我想说我想以非管理员身份更新用户记录:

@user.update_attributes(params[:user])

我收到以下例外:

ActiveModel::MassAssignmentSecurity::Error in UsersController#update
Can't mass-assign protected attributes: email, username

我想要发生的是忽略不可访问的参数,并且只更新可访问的属性,而目前整个更新失败。这是可能的,更重要的是这是推荐的做事方式吗?在调用update_attributes之前手动删除不可访问的参数会不会更好?

1 个答案:

答案 0 :(得分:0)

你可以做的一件事就是设置

config.active_record.mass_assignment_sanitizer = :logger

这将记录已过滤的属性,而不是抛出ActiveModel::MassAssignmentSecurity::Error

或者,您可以编写自己的清理程序ActiveModel::MassAssignmentSecurity::Sanitizer,自定义process_removed_attributes以静默方式失败。

至于你的其他问题

  

...这是推荐的做事方式吗?在调用update_attributes之前手动删除不可访问的参数会不会更好?

我认为你应该研究为什么你允许提交一个表单,其中包含Rails在提交某些角色而不是其他角色时会被拒绝的字段。例如,让普通用户查看/更改表单中的Username文本字段是没有意义的,如果attr_accessible的角色省略了该属性。

您应该隐藏非管理员用户的非管理员字段,并保留:strict清洁剂。 ActiveModel::MassAssignmentSecurity::Error被提出的唯一时间是,如果有人正在修改DOM,尝试提交未提供的字段,因此不允许修改相关模型。