有没有办法重命名强参数键?

时间:2013-03-15 02:13:57

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

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

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

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

我无法做到

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

因为foreign_id不是param

我无法做到

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

因为alias_id不在模型上。

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

2 个答案:

答案 0 :(得分:10)

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

所以,如果我有{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),我的模型将识别它并根据需要处理它而不会循环使用属性在我的控制器里。

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

答案 1 :(得分:1)

我使用以下代码获得了我想要的功能。我不认为强参数可以做我需要的,特别是因为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})