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

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

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

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

【问题讨论】:

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


    【解决方案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 securitymore 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-09
        • 1970-01-01
        相关资源
        最近更新 更多