验证失败时,Rails 3fields_for具有作用域删除字段

mwa*_*her 5 ruby-on-rails nested-forms simple-form

我将Rails 3,simple_form和cocoon用于has_many TodoLists项目的嵌套表单。我希望我的simple_fields_for调用仅包含尚未被软删除的TodoList,这就是为什么我想使用命名范围“未删除”的原因。

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

<%= f.simple_fields_for :todo_lists, f.object.todo_lists.nondeleted do |todo_list_form| render "todo_list_fields", :f => todo_list_form end %>
Run Code Online (Sandbox Code Playgroud)

这在我的编辑视图的首次加载时效果很好(即,未显示已删除的TodoList),但是在提交表单时通过了失败的验证,所有新添加的TodoList都会丢失。

如果删除命名作用域,则验证失败后不会丢失新添加的TodoList,但随后会显示所有TodoList(包括已删除的TodoList)。

我也尝试了以下方法:

<% @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 %>
Run Code Online (Sandbox Code Playgroud)

这解决了两个问题,但并没有提供我所需的灵活性,例如使TodoList保持正确顺序的能力。

有没有一种方法可以将集合传递给simple_fields_for(据我了解,它具有与Rails的fields_for相同的相关行为),这将允许我使用命名范围和排序,而不会在验证失败时删除新添加的字段?

mwa*_*her 0

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

has_many :todo_lists, :conditions => { :deleted => false }, :order => :name
Run Code Online (Sandbox Code Playgroud)

在视图中它很简单:

<%= f.simple_fields_for :todo_lists do |todo_list_form| render "todo_list_fields", :f => todo_list_form end %>
Run Code Online (Sandbox Code Playgroud)