使用Rails 3.1:as => :admin用于更新受attr_accessible保护的属性

时间:2012-01-09 23:51:21

标签: ruby-on-rails ruby-on-rails-3.1 mass-assignment attr-accessible

在阅读attr_accessible in the Rails 3.1 API后,我发现其中有一个:admin选项。我想知道两件事。

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

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

3 个答案:

答案 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)

以类似的方式,newcreatecreate!update_attributesupdate_attributes!方法都尊重质量分配安全性。 Ruby on Rails guide on securitymore 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)