回答

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_attributesupdate_attributes!方法都考虑到质量指派的安全性。 Ruby on Rails guide on securitymore info

+0

工作得很好我有一个问题,虽然。我将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

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

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)