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相同的相关行为),这将允许我使用命名范围和排序,而不会在验证失败时删除新添加的字段?
我能够通过修改项目模型的 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)
| 归档时间: |
|
| 查看次数: |
1015 次 |
| 最近记录: |