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