【问题标题】:Permit extra params in special cases with Strong Params in Rails 4在 Rails 4 中使用 Strong Params 在特殊情况下允许额外的参数
【发布时间】:2015-07-08 15:50:27
【问题描述】:

所以对于一个组织,我希望用户能够编辑一些关于它的东西。

params.require(:organization).permit(:name, :location)

但在特殊情况下,我希望管理员能够编辑额外的属性

params.require(:organization).permit(:name, :location, :secrets)

现在我知道我可以只使用一个 if 语句来选择我想使用哪一行,但由于管理员将始终能够编辑原始属性,我希望能够轻松地像这样包含它们:

permitted = params.require(:organization).permit(:name, :location)
permitted.permit(:secrets) if current_user.admin?

有没有办法像这样链接 permit 调用?或者我是否必须在进行许可调用之前将属性存储在数组中并有条件地添加额外内容?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 strong-parameters


    【解决方案1】:

    这似乎是要走的路:

    def permitted_params
      if current_user.admin?
        params.require(:organization).permit(:name, :location, :secrets)
      else
        params.require(:organization).permit(:name, :location)
      end
    end
    

    然后在你的控制器中使用permitted_params

    【讨论】:

    • 这似乎只允许秘密,它也不允许名称和位置
    • 是的,似乎无法链接许可。只需要
    • 我不是这个的忠实粉丝,尤其是因为我有很多属性。除非有人想出更好的办法,否则我会发布我正在做的事情的答案
    【解决方案2】:

    使用以下技术,无需编写两次相同的参数,如果您有很长的属性列表,这将很有帮助。

    def organization_params
      attributes = [:name, :location]
      attributes.push(:secrets) if current_user.admin?
    
      params.require(:organization).permit(attributes)
    end
    

    【讨论】:

      【解决方案3】:

      你应该做的很简单:

      def organization_params
        basic_filter = %w(name location)
        filter = user.admin? ? basic_filter.push('secrets') : basic_filter
        params.require(:organization).permit(filter)
      end
      

      这将如您所见:

      [20] pry(main)> params = ActionController::Parameters.new({
      [20] pry(main)*     organization: {  
      [20] pry(main)*       name: 'Francesco',    
      [20] pry(main)*       location:  'L.A.',    
      [20] pry(main)*       secrets: 'secrets'    
      [20] pry(main)*     }    
      [20] pry(main)* })    
      => {"organization"=>{"name"=>"Francesco", "location"=>"L.A.", "secrets"=>"secrets"}}
      [21] pry(main)> basic_filter = %w(name location)
      => ["name", "location"]
      [22] pry(main)> filter = true ? basic_filter.push('secrets') : basic_filter
      => ["name", "location", "secrets"]
      [23] pry(main)> params.require(:organization).permit(filter)
      => {"name"=>"Francesco", "location"=>"L.A.", "secrets"=>"secrets"}
      

      如果user.admin?false,则结果为

      [26] pry(main)> basic_filter
      => ["name", "location", "secrets"]
      [27] pry(main)> basic_filter = %w(name location)
      => ["name", "location"]
      [28] pry(main)> filter = false ? basic_filter.push('secrets') : basic_filter
      => ["name", "location"]
      [29] pry(main)> params.require(:organization).permit(filter)
      Unpermitted parameter: secrets
      => {"name"=>"Francesco", "location"=>"L.A."}
      

      这可能会对你有所帮助。

      【讨论】:

      • 这似乎比我的答案稍微复杂一些,但感谢您的尝试!
      • @TMP 是的,实际上我认为我所做的正是您所做的。这是因为我在只有一个答案(不是你的)时开始回答这个问题,很快我就被什么东西打断了。当我回来完成我的答案时,我发现你的答案一直在那里......我很抱歉,我想在你的答案中添加评论,让你知道我做了一个重复的答案但失败了。因为我被注意到我必须有 50 声望才能发表评论。 : (
      • 别担心!只是想确保我没有遗漏什么。祝您在获得评论能力的过程中好运!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      相关资源
      最近更新 更多