强参数:条件参数

时间:2015-10-19 17:03:27

标签: ruby-on-rails ruby-on-rails-4 strong-parameters

我想根据输入表单中的选择(是/否响应3个单独的复选框)传递条件参数。我尝试使用if then else方法,但由于8个不同的选项,这显然不优雅。有人可以提供更好的解决方案吗?

我遇到了以下帖子并尝试了我的解释,但无法弄清楚正确的答案。

Strong Parameters: How to permit parameters using conditions

  

预期结果:   如果单击给定复选框,则特定嵌套模型将更新/实例创建,否则不

     

我对参数的尝试

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

1 个答案:

答案 0 :(得分:0)

为了扩展到8甚至更多,我会把你的重复逻辑放在一个循环中。然后将动态部分(下面的粗体)抽象为数组。

list_params_allowed + = [:cond 1 _attributes [:name,:country ]]如果params [:lapp] [:ind_var 1 ] == 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,因为这在功能上是等效的。希望这有帮助!