0

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

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 之前手动去除不可访问的参数会更好吗?

4

1 回答 1

0

您可以做的一件事是设置

config.active_record.mass_assignment_sanitizer = :logger

这将记录过滤后的属性而不是 throwing ActiveModel::MassAssignmentSecurity::Error

或者,您可以编写自己的 sanitizer 扩展ActiveModel::MassAssignmentSecurity::Sanitizer,自定义process_removed_attributes以静默失败。

至于你的其他问题

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

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

相反,您应该为非管理员用户隐藏非管理员字段,并将:strict消毒剂留在原处。唯一ActiveModel::MassAssignmentSecurity::Error会引发的情况是,如果有人正在修改 DOM,试图提交他们未提供的字段,因此不允许修改相关模型。

于 2012-08-21T20:57:12.013 回答