2015-10-19 77 views
0

我想在输入表单中根据选择传递条件参数(是/否响应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 

回答

0

为了缩放到8或ev更重要的是,我会把你的重复逻辑放在一个循环中。然后将动态部分(以粗体显示)抽象为数组。

list_params_allowed + = [:COND _attributes [:名称,:国家]]如果PARAMS [:LAPP] [:ind_var ] == 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,因为这在功能上是等效的。希望这可以帮助!