在阅读了 Rails 3.1 API 中的 attr_accessible之后,我看到那里有一个 as:admin
选项。我想知道两件事。
如果用户有管理员标志,我的控制器如何告诉我的模型用户是管理员。
如果用户是所有者,我可以
:as => owner
在我的模型中指定,并且我的控制器如何再次通知我的模型他们是项目的所有者。
在阅读了 Rails 3.1 API 中的 attr_accessible之后,我看到那里有一个 as:admin
选项。我想知道两件事。
如果用户有管理员标志,我的控制器如何告诉我的模型用户是管理员。
如果用户是所有者,我可以:as => owner
在我的模型中指定,并且我的控制器如何再次通知我的模型他们是项目的所有者。
没有与模型的内置集成;您在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 安全指南有更多信息。
对于这两种情况,您都将以与最初声明它相同的方式传递它。例如:
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
应正确定义您要作为特定用户访问的所有属性。例如:
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)