【问题标题】:Is there a way to rename Strong Parameter keys?有没有办法重命名强参数键?
【发布时间】:2013-03-15 02:13:57
【问题描述】:

假设我的控制器中的代码没有使用强参数

Model.create name: params[:name], alias_id: params[:foreign_id]

我可以在这里使用强参数吗?

我做不到

Model.create params.require(:name, :foreign_id)

因为foreign_id不是参数

我做不到

Model.create params.require(:name, :alias_id)

因为 alias_id 不在模型上。

基本上,我想知道在使用强参数时是否可以给参数键起别名。

【问题讨论】:

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


    【解决方案1】:

    通常如果我想以这种方式映射参数(通常是由于某些外部 API),我会使用 ActiveRecord 中的 alias_attribute 方法

    因此,如果我有以 {name: "bob", alias_id: 1234} 的形式出现的参数,理想情况下我希望拥有 {name: "bob", foreign_id: 1234}

    我在我的ActiveRecord 模型中声明以下内容

    class MyModel < ActiveRecord::Base
      alias_attribute :alias_id, :foreign_id
    end
    

    现在我的模型将始终将alias_id 识别为在任何上下文中映射到foreign_id,我可以推入params.require(:name, :alias_id),我的模型将识别它并根据需要对其进行处理,而无需循环控制器中的属性。

    如果您也想在其他模型上这样做,这也更简单。

    【讨论】:

    • TIL。感谢您的洞察力!
    【解决方案2】:

    我通过以下代码获得了我想要的功能。我不认为强参数可以做我需要的,尤其是 require() 不能接受多个参数。

    通过将它放在我的 ApplicationController 或它继承的模块中

    #
    # Pass in a list of param keys to pull out of the params object
    # Alias param keys to another key by specifiying a mapping with a Hash
    # eg.  filter_params :foo, :bar, {:choo => :zoo}
    #
    def filter_params(*param_list)
      filtered_params = {}
      param_list.each do |param|
        if param.is_a? Hash
          param.each {|key, value| filtered_params[value] = params[key]}
        else
          filtered_params[param] = params[param]
        end
      end
      filtered_params
    end
    

    我现在可以说

    Model.create filter_params(:name, {foreign_id: :alias_id})
    

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      相关资源
      最近更新 更多