假设我在没有使用强参数的控制器中有代码
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不在模型上。
基本上,我想知道在使用强参数时是否可以使用参数键别名。
答案 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})