在阅读attr_accessible in the Rails 3.1 API后,我发现其中有一个:admin
选项。我想知道两件事。
如果用户有管理员标志,我的控制器如何告诉我的模型该用户是管理员。
如果用户是所有者,我可以在模型中指定:as => owner
吗?我的控制器如何通知我的模型他们是项目的所有者。
答案 0 :(得分:18)
没有与模型的内置集成;你在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。
答案 1 :(得分:3)
对于这两种情况,您将以与最初声明它相同的方式传递它。例如:
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
答案 2 :(得分: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)