Есть ли способ переименовать ключи Strong Parameter?

Допустим, у меня был код в контроллере, который не использовал Strong Parameters.

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

Могу ли я использовать сильные параметры здесь?

Я не могу сделать

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

Потому что external_id не является параметром

Я не могу сделать

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

Потому что alias_id не на модели.

По сути, я хочу знать, можете ли вы использовать псевдонимы ключей параметров при использовании сильных параметров.


person Chris Aitchison    schedule 15.03.2013    source источник


Ответы (2)


Обычно, если я хочу отобразить параметры таким образом (обычно из-за какого-то внешнего 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), и моя модель распознает его и обработает по мере необходимости, не зацикливаясь на атрибутах в моем контроллере.

Это также проще, если вы хотите сделать это и на других моделях.

person Tyrone Wilson    schedule 22.06.2016
comment
ТИЛ. Спасибо за понимание! - person Chris Aitchison; 23.06.2016

Я получил желаемую функциональность с помощью следующего фрагмента кода. Я не думаю, что Strong Parameters может сделать то, что мне нужно, тем более, что 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})
person Chris Aitchison    schedule 15.03.2013