2

我有一个模型,它有一个像这样定义的文本数组字段

t.text "widgets", default: [], array: true和我的控制器中允许的参数

params.require(:model).permit(widgets: [])

在我看来,我可以使用看起来像的输入字段来构建要放入此数组的值

<input multiple="true" value="widget_name" name="model[widgets][]" id="model_widgets"/>

这适用于从数组中添加和删除值的所有情况,除了从数组中删除最后一个值(如果它已经存在于模型中)的情况

是否有一个神奇的隐藏输入可以用来将一个空数组传回控制器进行更新?

我知道复选框也有类似的问题,您可以在其中使用值为 0 的隐藏字段。我尝试过使用类似的方法,例如

<input type="hidden" value="0" name="model[widgets][]" id="model_widgets"/>它将一个数组返回给控制器,看起来像["0"](显然),

<input type="hidden" value="0" name="model[widgets]" id="model_widgets"/>这是控制器中不允许的参数(因为它不是数组),甚至

<input type="hidden" value="[]" name="model[widgets]" id="model_widgets"/>- 也是不允许的,希望有一个空数组。

我知道我可以通过在我的控制器中启用一个新参数来完成这项任务,该参数在出现时表示一个空的小部件数组,但我希望从视图的角度来看有一个“正确”的方法。

4

2 回答 2

0

你有没有尝试过?:

<input name="model[widgets][]" type="hidden" value="" />

并在控制器中做Array.wrap(params.dig(:model, :widgets)).reject(:blank?)分配?

于 2020-03-11T11:12:51.770 回答
0

答案似乎是否定的——没有神奇的隐藏输入将空数组传回控制器。由于模型不会为缺少的参数更新字段,因此应在控制器中使用默认值。

我找到了一种使用许可参数完成此任务的优雅方法,我使用提供的导轨reverse_merge为数组设置默认值,这样如果它们被排除在 POST 参数之外,它们将是空的而不是不存在(即删除所有隐藏的输入因为该参数将导致使用一个空数组)。

def permitted_params
  defaults = { widgets: [] }
  params.require(:model).permit(widgets: []).reverse_merge(defaults)
end
于 2020-03-29T14:55:30.203 回答