5

我正在使用 Rails 3、simple_form 和 cocoon 作为包含多个 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 %>

这在我的编辑视图的第一次加载时工作正常(即未显示已删除的 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 具有相同的相关行为),这将允许我使用命名范围和排序,而不会在验证失败时丢弃新添加的字段?

4

2 回答 2

0

我能够通过修改我的项目模型的 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 %>
于 2012-11-25T22:38:25.790 回答
0

默认范围也可以解决问题

class Foo < ActiveRecord::Base
  has_many :bars
end

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

<%= f.simple_fields_for :bars ... %>
于 2014-08-21T13:27:30.267 回答