nested_form在错误消息后显示额外的字段

时间:2016-02-06 21:44:03

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

我正在使用simple_nested_form_for来构建带有嵌套字段的表单。字段是动态添加的

在呈现包含错误的表单时(通过create),嵌套字段会出错。

多次显示相同的嵌套字段,name元素中的索引值错误。

例如,嵌套字段中的FormBuilder index最初是一个随机数,例如1454793731550。重新渲染后,它们只会变为正常增量0-n

为什么FormBuilder index最初是一个随机数?

有什么建议可以在这里发生什么?

  def new
    @transaction = current_company.transactions.build
    @transaction.subtransactions.build
  end

  def create
    @transaction = current_company.transactions.new(transaction_params)

    if @transaction.save
      redirect_to dashboard_url
    else
      @transaction.subtransactions.build
       render :action => 'new'
    end

1 个答案:

答案 0 :(得分:1)

index是嵌套字段的child_index。这只是Rails单独识别HTML表单元素的各种字段名称的一种方式:

<%= f.fields_for :association do |a| %>
  <%= a.text_field :x %> #-> "child_index" id will either be sequential (0,1,2)
<% end %>

child_index并不重要。只要它是唯一的,它应该按如下方式传递给控制器​​:

params: {
  association_attributes: {
    0: { x: "y", z: "0" },
    1: { ... }
  }
}

经常使用的一个技巧是将child_index设置为Time.now.to_i,这允许您在范围之外添加新字段:

<%= f.fields_for :association, child_index: Time.now.to_i do |a| %>

关于可能出现问题的new操作,每次都会构建subtransactions对象(无论实例是否填充了以前的数据)。

之前我们遇到过这个问题,我相信我们用条件解决了这个问题:

def new
  @transaction = current_company.transactions.build
  @transaction.subtransactions.build unless @transaction.errors.any?

这应该通过提交过程保持对象的完整性。 IE如果发生错误,我相信Rails会将关联的对象存储在内存中(就像它与父级一样)。