ruby-on-rails - 验证失败时,Rails 3 fields_for 范围会删除字段

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

我正在使用 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/

相关文章:

javascript - 如何实时将text_field单词大写(不包括介词)?

javascript - rails如何以一种形式嵌套形式?

css - 简单形式 : nested model form elements on one line?

html - 带复选框的简单表单内联输入

ruby-on-rails - Foreman/Puma 未使用开发环境中的指定端口

ruby-on-rails - Rails3 Controller 操作中的条件语句

ruby-on-rails - 如何在 Rails 中使用一种表单创建另一个模型时更新模型

ruby-on-rails - 创建 has_many :through records 时跳过验证

css - rails : How to add "style=" in grouped_select in simple form

ruby-on-rails - 如何追踪 Rails 应用程序中的内存泄漏?