我正在使用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
答案 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会将关联的对象存储在内存中(就像它与父级一样)。