我想根据输入表单中的选择(是/否响应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 :(得分: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,因为这在功能上是等效的。希望这有帮助!