设置嵌套表单中关联记录数的限制

时间:2012-06-15 03:13:57

标签: ruby-on-rails-3

我有一个嵌套的表单,其结构如下:

  • 解释
    • 产品

我在列表模型中运行验证,以确保每个列表最多只有十个项目。

validate :max_stack_items

def max_stack_items
  if items.size > 10
    errors[:base] << "Stack cannot have more than 10 items"
end

这种方法在90%的情况下都能正常工作。我实现了一项功能,因此您可以删除列表表单中的列表项,如下所示:

<%= f.hidden_field :_destroy %>
<%= link_to "remove item", '#', class: "remove_fields" %>

我有一些相关的javascript可以实现这一点(对于这个问题并不重要)。

假设我已经有10个列表项,我去编辑表单。如果我通过单击“删除项目”链接删除其中一个列表项并添加新列表项。验证失败,因为它认为有超过10个列表项。换句话说,它没有意识到我已经删除了一个列表项并同时添加了另一个列表项(因此仍然只有10个列表项)。

如何让验证考虑到我同时删除哪些列表项记录?

1 个答案:

答案 0 :(得分:5)

def max_stack_items
  if restaurants.reject(&:marked_for_destruction?).size > 10
    errors[:base] << "Stack cannot have more than 10 items"
  end
end

此解决方案会考虑验证期间标记为销毁的项目。