这是对上一篇文章的重新修改
我之前认为这个问题与cocoon相关,但现在我不这么认为,因为以下代码甚至没有调用cocoon
每次我更新包含嵌套属性的表单时,嵌套记录的数量都会翻倍。从我可以收集到的这种情况发生在调用表单时,因为我在做任何事情之前立即看到更新并且表单带有重复条目
我在下面的HAML中有我的观点的相关代码 -
%h3 Household Members
= f.simple_fields_for :neighbors do |neighbor|
= render 'neighbor_fields', :f => neighbor
我正在使用我的控制器正常曝光,所以控制器看起来像这样:
class HouseholdsController < ApplicationController
expose(:households)
expose(:household, strategy: StrongParametersStrategy)
def create
if household.save
redirect_to households_path, notice: 'Household was successfully created.'
else
render 'new'
end
end
def update
if household.save
redirect_to households_path, notice: 'Household was successfully updated.'
else
render 'edit'
end
end
def destroy
household.destroy
redirect_to households_path, notice: 'Household deleted.'
end
如何防止嵌套属性加倍?
答案 0 :(得分:3)
我之前从未使用过合适的曝光,但是我遇到了使用嵌套表格的相同问题,无论是否有茧,原因在两种情况下都是相同的。它与强参数有关,而不是白名单列出嵌套属性的:id
。
我不确定我到底想要做什么,所以我会给出一个经典的帖子/评论示例。如果您有一个帖子表单,并且您想动态添加注释字段,则控制器中的强参数将如下所示。
params.require(:post).permit(:content, comments_attributes: [:id, :content, :_destroy])
您需要白名单:id
,:_destroy
以及嵌套字段的其他任何属性。如果评论中没有:id
,则rails会认为它是新评论并为其创建新记录。白名单列出:id
时,rails会知道它是现有对象,然后只更新它。