使用 Rails 3.1 :as => :admin 更新受 attr_accessible 保护的属性
Posted
技术标签:
【中文标题】使用 Rails 3.1 :as => :admin 更新受 attr_accessible 保护的属性【英文标题】:Using Rails 3.1 :as => :admin for updating attributes protected by attr_accessible 【发布时间】:2012-02-06 11:37:06 【问题描述】:在阅读了attr_accessible in the Rails 3.1 API 之后,我看到那里有一个 as :admin
选项。我想知道两件事。
如果用户有管理员标志,我的控制器如何告诉我的模型用户是管理员。
如果用户是所有者,我可以在我的模型中指定:as => owner
,并且我的控制器如何再次通知我的模型他们是项目的所有者。
【问题讨论】:
【参考方案1】:没有与模型的内置集成;您在assign_attributes
调用中传递角色:
@project.assign_attributes(params[:project], :as => :admin)
:as
参数默认为:default
,你可以传入任何你想要的符号。要将其集成到您的 User
模型中,您可以给它一个名为 role
的属性,然后执行以下操作:
@project.assign_attributes(params[:project], :as => current_user.role.to_sym)
您也可以使用:without_protection
绕过保护:
@project.assign_attributes(params[:project], :without_protection => true)
以类似的方式,new
、create
、create!
、update_attributes
和 update_attributes!
方法都尊重批量分配的安全性。 Ruby on Rails guide on security 有 more info。
【讨论】:
我有一个问题。我正在将 Rails 4 升级到 5(以前在 Rails 3 上。我遇到了类似@project.update_attributes(params[:project], :as => current_user.role.to_sym)
的东西,但我收到一个错误,说 update_attributes
只接受一个参数。as: :admin
发生了什么这段代码的一部分?完全删除它是否安全?【参考方案2】:
对于这两种情况,您都可以按照最初声明它的方式传递它。比如:
class User < ActiveRecord::Base
attr_accessible :name
attr_accessible :credit_card, :as => :admin
end
如果你这样做了
user = User.new(:name => "John", :credit_card => "1234123412341234")
那么你将无法分配credit_card
:
user.attributes # :name => "John", :credit_card => nil
但是,如果您声明它将是 :as => :admin
,那么它允许它
user = User.new(:name => "John", :credit_card => "1234123412341234", :as => :admin)
user.attributes # :name => "John", :credit_card => "1234123412341234"
更多信息:
http://www.enlightsolutions.com/articles/whats-new-in-edge-scoped-mass-assignment-in-rails-3-1
【讨论】:
【参考方案3】:您要作为特定用户访问的所有属性都应正确定义。例如:
class User < ActiveRecord::Base
attr_accessible :name
attr_accessible :credit_card, :as => :admin
end
这对我来说显示错误。 但是当我将其修改为
class User < ActiveRecord::Base
attr_accessible :name
attr_accessible :name, :credit_card, :as => :admin
end
当我使用时效果很好
@user.update_attributes(params[:user], :as => :admin)
【讨论】:
以上是关于使用 Rails 3.1 :as => :admin 更新受 attr_accessible 保护的属性的主要内容,如果未能解决你的问题,请参考以下文章
使用 Jasmine 和 Rails 3.1 测试 Coffeescript
rails_3_question :as => 为啥在设置 slug 后我的 /posts/new 路由到 posts/show