我的用户模型上有一个字段受到保护,因为它决定了许可级别。因此它应该受到保护并且不能大规模分配。因此,尽管属性在 3.2 中默认受到保护,但这实际上是我想要的行为。
但是,在一种 Controller 方法上,我希望允许管理员分配此字段,例如在用户创建或用户更新时。
如何允许为特定 Controller 操作分配该属性?
例如,我有我的 Controller :
# app/controllers/admin/users_controller.rb
def create
@user = User.new(params[:user])
# ...
end
现在我要做的就是从 params[:user]
中排除 clearance
,但即使在到达该行之前它似乎也会被过滤掉并引发异常(我尝试在该行之前放置一个调试器,甚至将其注释掉,它仍然引发异常)。
如果不是在调用 User#new
时捕获 protected 属性,那么在哪里捕获?
最佳答案
The Rails way为此,将在没有保护的情况下分配属性或使用管理员角色:
@user = User.new
@user.assign_attributes(params[:user], :without_protection => true)
@user.save
但是,我发现这有点乏味,所以我写了一个名为 sudo_attributes 的 gem (在我看来)这提供了更好的 API:
@user = User.sudo_new(params[:user])
@user.save
它模仿所有 Rails 实例化、创建和更新方法(new、build、create、create!、update_attributes 等)。
关于ruby-on-rails - Rails 中 protected 属性的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10989513/