【问题标题】:How can I add strong parameters to my controller using a concern file?如何使用关注文件向控制器添加强参数?
【发布时间】:2017-08-03 10:05:08
【问题描述】:

我如何添加强参数到我的控制器使用关注文件?

假设我有多个控制器使用的:name, :age, :sex 参数,我的想法是创建一个关注模块,在其中存储这些common_params 并将它们添加到允许的参数中,因为我在下面模糊地尝试这样做.

控制器

class PersonController < ApplicationController
  include CommonHelper

  def update
    @person.create(person_params)
  end

  private 

    def person_params
      params.require(:person).permit(:foo, :bar, common_params)
    end
end

关注

module CommonHelper
  extend ActiveSupport::Concern

  def common_params
    { :name, :age, :sex }
  end
end

理想情况下,我应该得到与之前相同的结果:permit(:foo, :bar, :name, :age, :sex)

【问题讨论】:

    标签: ruby ruby-on-rails-5 strong-parameters activesupport-concern


    【解决方案1】:

    您可以使用* 运算符,它将数组拆分为参数列表,并可作为现有参数列表的一部分:

    params= ActionController::Parameters.new(person: {foo: 'something', bar: 'something else', name: 'Someone', age: 27, sex: 'M', random: 'not valid'})
    
    # however you want to define and include these (method, constant, etc)
    def common_params
      [:name, :age, :sex]
    end
    
    params.require(:person).permit(:foo, :bar, *common_params)
    # => <ActionController::Parameters {"foo"=>"something", "bar"=>"something else", "name"=>"Someone", "age"=>27, "sex"=>"M"} permitted: true>
    

    【讨论】:

    • 显然在最后加上*common_params是不对的。我收到错误 500,在我的日志中显示 syntax error, unexpected *, expecting ')'。如果它是 permit 的第一个参数,则不会发生这种情况。
    • 奇怪,你所有的逗号都排成一行了吗?我的意思是它显然在这里的示例中工作..列表的前面与列表的后面最终得到相同的输出,这很奇怪它不适合你
    • 发现了。我有一个嵌套参数foo: [:x, :y, :z] 并在生成错误后添加*common_params。只要它在嵌套之前就可以了。不过不确定是什么问题。
    • 嗯,有道理,你没有把它包在花括号中,所以哈希必须是参数列表中的最后一个东西才能像那样......可以通过以下方式修复它也在做permit({foo: [:x, :y, :z]}, :bar, *common_params)
    • 就是这样!谢谢@Simple Lime
    【解决方案2】:

    关注

    module CommonHelper
      COMMON_PARAMS = %i[ name age sex ].freeze
    end
    

    控制器

    def person_params
      params
        .require(:person)
        .permit([:foo, :bar] | CommonHelper::COMMON_PARAMS)
    end
    

    【讨论】:

      【解决方案3】:

      2018 年更新: Rails:5.2.0 和 Ruby:2.5.1

      像这样创建一个关注模块:

      app/controllers/concerns/Xxxxx_helper.rb

      module XxxxxHelper COMMON_STRONG_PARAMS = %i[ param1 param2 param3 ].freeze end

      在你的控制器中做:

      def xxxxxx_params params.require(:xxxxxx).permit(:some_param :another_param, :another_param, :last_param, XxxxxHelper::COMMON_STRONG_PARAMS) end

      这行得通!

      【讨论】:

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