阅读attr_accessible in the Rails 3.1 API之后,我看到那里有一个:admin
选项。我想知道两件事情。使用Rails 3.1:as =>:admin用于更新由attr_accessible保护的属性
如果用户有管理员标志,我的控制器如何告诉我的模型用户是管理员。
如果用户是所有者,我可以在我的模型中指定
:as => owner
,并且我的控制器再次如何通知我的模型他们是项目的所有者。
阅读attr_accessible in the Rails 3.1 API之后,我看到那里有一个:admin
选项。我想知道两件事情。使用Rails 3.1:as =>:admin用于更新由attr_accessible保护的属性
如果用户有管理员标志,我的控制器如何告诉我的模型用户是管理员。
如果用户是所有者,我可以在我的模型中指定: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 guide on security有more info。
对于这两种情况,您都会按照您最初声明的方式传递它。因此,例如:
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
这对我显示错误。 但是当我modied到
class User < ActiveRecord::Base
attr_accessible :name
attr_accessible :name, :credit_card, :as => :admin
end
这当我用
@user.update_attributes(params[:user], :as => :admin)
工作得很好我有一个问题,虽然。我将Rails 4升级到5(这是之前在Rails 3上的版本),并且我遇到了类似于@project.update_attributes(params [:project],:as => current_user.role.to_sym)''但是我得到一个错误,说'update_attributes'只接受一个参数。这个代码中的'as::admin'部分发生了什么?是否可以完全删除它? – Emanuel 2017-06-16 10:54:40