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

Posted

技术标签:

【中文标题】使用 Rails 3.1 :as => :admin 更新受 attr_accessible 保护的属性【英文标题】:Using Rails 3.1 :as => :admin for updating attributes protected by attr_accessible 【发布时间】:2012-02-06 11:37:06 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

没有与模型的内置集成;您在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 security 有 more info。

【讨论】:

我有一个问题。我正在将 Rails 4 升级到 5(以前在 Rails 3 上。我遇到了类似 @project.update_attributes(params[:project], :as => current_user.role.to_sym) 的东西,但我收到一个错误,说 update_attributes 只接受一个参数。as: :admin 发生了什么这段代码的一部分?完全删除它是否安全?【参考方案2】:

对于这两种情况,您都可以按照最初声明它的方式传递它。比如:

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 =&gt; :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

【讨论】:

【参考方案3】:

您要作为特定用户访问的所有属性都应正确定义。例如:

    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)

【讨论】:

以上是关于使用 Rails 3.1 :as => :admin 更新受 attr_accessible 保护的属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jasmine 和 Rails 3.1 测试 Coffeescript

Rails 3.1 实时预览

rails_3_question :as => 为啥在设置 slug 后我的 /posts/new 路由到 posts/show

Rails 3.1 资产 - 奇怪的开发服务

Rails 3.1 - 嵌入 flash.swf 文件 - 最佳实践?

Rails as_json 包含条件