【问题标题】: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),我的模型将识别它并根据需要对其进行处理,而无需循环控制器中的属性。
如果您也想在其他模型上这样做,这也更简单。
【解决方案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})