3

Допустим, у меня был код в контроллер, который не использовал сильные параметрыЕсть ли способ переименовать ключи Strong Parameter?

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 не на модели.

В принципе, я хочу знать, можете ли вы использовать псевдоним paramater при использовании сильных параметров.

ответ

5

Обычно, если я хочу, чтобы отобразить PARAMS таким образом (как правило, из-за какого-то внешнего API) Я использую метод alias_attribute в ActiveRecord

Так что, если у меня есть параметры, которые приходят ко мне как {name: "bob", alias_id: 1234}, и в идеале я wo пакетирования хотят иметь {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

TIL. Спасибо за понимание! –

1

Я получил функциональность, которую я хотел, со следующим фрагментом кода. Я не думаю, что 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}) 
Смежные вопросы