我正在使用 Rails 3、simple_form 和 cocoon 作为具有许多 TodoLists 的项目的嵌套表单。我希望我的 simple_fields_for 调用只包含尚未被软删除的 TodoLists,这就是为什么我想使用我的命名范围“非删除”。
在我的项目形式中,我有:
<%= f.simple_fields_for :todo_lists, f.object.todo_lists.nondeleted do |todo_list_form| render "todo_list_fields", :f => todo_list_form end %>
这在我的编辑 View 第一次加载时工作正常(即未显示已删除的 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 具有相同的相关行为),这将允许我使用命名范围和排序,而不会在验证失败时删除新添加的字段?
最佳答案
我能够通过修改我的项目模型的 has_many :todo_lists 关联来解决这个问题,如下所示:
has_many :todo_lists, :conditions => { :deleted => false }, :order => :name
在 View 中它很简单:
<%= f.simple_fields_for :todo_lists do |todo_list_form| render "todo_list_fields", :f => todo_list_form end %>
关于ruby-on-rails - 验证失败时,Rails 3 fields_for 范围会删除字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13546885/