Rails 3 fields_for在验证失败时使用范围删除字段

时间:2012-11-24 23:54:21

标签: ruby-on-rails nested-forms simple-form

我正在使用Rails 3,simple_form和cocoon作为has_many TodoLists的项目的嵌套表单。我希望我的simple_fields_for调用只包括未被软删除的TodoLists,这就是为什么我想使用我的命名范围“nondeleted”。

在我的项目表格中,我有:

<%= f.simple_fields_for :todo_lists, f.object.todo_lists.nondeleted do |todo_list_form| render "todo_list_fields", :f => todo_list_form end %>

这在第一次加载我的编辑视图时工作正常(即未显示已删除的TodoLists),但在提交验证失败的表单时,任何新添加的TodoLists都会丢失。

如果我删除了命名范围,则在验证失败时新添加的TodoLists不会丢失,但随后会显示所有TodoLists(包括已删除的TodoLists)。

我也尝试了以下内容:

<% @project.todo_lists.each do |todo_list| %>
    <% if !todo_list.deleted && !todo_list.name.blank? %>
     <%= f.simple_fields_for :todo_lists, todo_list do |todo_list_form| render "todo_list_fields", :f => todo_list_form end %>
    <% end %>
<% end %>

这解决了这两个问题,但不允许我提供所需的灵活性,例如能够使TodoLists保持正确的顺序。

有没有办法将一个集合传递给simple_fields_for(根据我的理解,它与Rails的fields_for具有相同的相关行为),这将允许我使用命名范围并进行排序,而不会丢弃新添加的字段验证

2 个答案:

答案 0 :(得分:0)

我能够通过修改我的Project模型的has_many:todo_lists关联来解决此问题,如下所示:

has_many :todo_lists, :conditions => { :deleted => false }, :order => :name

在视图中它只是:

<%= f.simple_fields_for :todo_lists do |todo_list_form| render "todo_list_fields", :f => todo_list_form end %>

答案 1 :(得分:0)

默认范围也可以解决问题

class Foo < ActiveRecord::Base
  has_many :bars
end

class Bar < ActiveRecord::Base
  default_scope { where(active: true) }
end

<%= f.simple_fields_for :bars ... %>