11

在阅读了 Rails 3.1 API 中的 attr_accessible之后,我看到那里有一个 as:admin选项。我想知道两件事。

  1. 如果用户有管理员标志,我的控制器如何告诉我的模型用户是管理员。

  2. 如果用户是所有者,我可以:as => owner在我的模型中指定,并且我的控制器如何再次通知我的模型他们是项目的所有者。

4

3 回答 3

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)

以类似的方式,newcreatecreate!update_attributesupdate_attributes!方法都尊重批量分配安全性。Ruby on Rails 安全指南有更多信息

于 2012-01-10T06:56:18.660 回答
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

于 2012-01-10T06:57:41.330 回答
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)
于 2014-09-12T00:43:49.417 回答