Сильные параметры: условные параметры

Я хочу передать условные параметры на основе выбора (да/нет ответов на 3 отдельных флажка) в форме ввода. Я попытался использовать подход if then else, но это явно не элегантно из-за 8 различных вариантов. Может кто-нибудь предложить лучшее решение?

Я наткнулся на следующий пост и попробовал свою интерпретацию, но не смог найти правильный ответ.

Надежные параметры: как разрешить параметры с использованием условий

Ожидаемый результат: если установлен флажок, конкретная вложенная модель будет обновлена/создан экземпляр, иначе нет

Моя попытка параметров

def lapp_params
  list_params_allowed = [:amount]
  list_params_allowed += [:cond1_attributes[:name, :country]] if params[:lapp][:ind_var1]==1
  list_params_allowed += [:cond2_attributes[:name,:course]] if params[:lapp][:ind_var2]==1
  list_params_allowed += [:cond3_attributes[:name,:company]] if params[:lapp][:ind_var3]==1

  params.require(:lapp).permit(list_params_allowed).merge(user_id: current_user.id)
end

person Ankit Mehra    schedule 19.10.2015    source источник


Ответы (1)


Чтобы масштабировать до 8 или даже больше, я бы зациклил вашу повторяющуюся логику. Затем абстрагируйте динамические части (выделены жирным шрифтом ниже) в массив.

list_params_allowed += [:cond1_attributes[:name, :country]] if params[:lapp][:ind_var1]== 1

Массив будет выглядеть примерно так:

possible_conditions = [
    {number: "1", value: "country"},
    {number: "2", value: "course"}
]

Затем вы можете перебрать свой массив следующим образом:

possible_conditions.each { |pc|
  list_params_allowed += ["cond#{pc[:number]}_attributes"[:name,pc[:value]]] if params[:lapp]["ind_var#{pc[:number]}"]==1
}

Можно заменить постоянные символы, такие как :cond1_attributes, интерполированной строкой, потому что это функционально эквивалентно. Надеюсь это поможет!

person Jason Anderson    schedule 20.10.2015