0

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
4

1 回答 1

1

indexchild_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_indexto 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 会将关联的对象存储在内存中(就像它与父对象一样)。

于 2016-02-06T22:14:38.853 回答