嵌套属性上的条目重复,具有良好的曝光

时间:2013-04-15 02:48:12

标签: ruby-on-rails simple-form cocoon-gem

这是对上一篇文章的重新修改

我之前认为这个问题与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

如何防止嵌套属性加倍?

1 个答案:

答案 0 :(得分:3)

我之前从未使用过合适的曝光,但是我遇到了使用嵌套表格的相同问题,无论是否有茧,原因在两种情况下都是相同的。它与强参数有关,而不是白名单列出嵌套属性的:id

我不确定我到底想要做什么,所以我会给出一个经典的帖子/评论示例。如果您有一个帖子表单,并且您想动态添加注释字段,则控制器中的强参数将如下所示。

params.require(:post).permit(:content, comments_attributes: [:id, :content, :_destroy])

您需要白名单:id:_destroy以及嵌套字段的其他任何属性。如果评论中没有:id,则rails会认为它是新评论并为其创建新记录。白名单列出:id时,rails会知道它是现有对象,然后只更新它。