Activemodel 如何将空文本数组从视图传递到控制器,以便在Rails中进行更新?

Activemodel 如何将空文本数组从视图传递到控制器,以便在Rails中进行更新?,activemodel,ruby-on-rails-6,applicationcontroller,Activemodel,Ruby On Rails 6,Applicationcontroller,我有一个模型,它的文本数组字段定义如下 t.text“widgets”,默认值:[],数组:true和我的控制器中允许的参数 params.require(:model).permit(小部件:[]) 在我看来,我可以使用类似于 这适用于从数组中添加和删除值的所有情况,但如果模型中已经存在最后一个值,则从数组中删除最后一个值的情况除外 我是否可以使用神奇的隐藏输入将空数组传递回控制器进行更新? 我知道复选框也有类似的问题,您可以使用值为0的隐藏字段。我试过使用类似的方法,比如 将数组返回给控制

我有一个模型,它的文本数组字段定义如下

t.text“widgets”,默认值:[],数组:true
和我的控制器中允许的参数

params.require(:model).permit(小部件:[])

在我看来,我可以使用类似于

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

我是否可以使用神奇的隐藏输入将空数组传递回控制器进行更新?

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

将数组返回给控制器,看起来像
[“0”]
(显然)

这是控制器中不允许的参数(因为它不是数组),甚至

-也未经许可,希望得到一个空数组

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

您尝试过吗?:



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

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

我发现了一种使用permit params实现这一点的优雅方法,我使用了rails提供的
reverse\u merge
来设置数组的默认值,因此如果POST参数中没有这些参数,它们将是空的,而不是不存在的(即,删除该参数的所有隐藏输入将导致使用空数组)


如果从控制器中删除name属性或像这样将value设置为空[“”]将空字符串添加到arrayeedited to add Controller部分,我知道不希望有这种开销,但如果需要使其工作,就可以了。
def permitted_params
  defaults = { widgets: [] }
  params.require(:model).permit(widgets: []).reverse_merge(defaults)
end