Rails 7嵌套表单无法生成唯一ID,仅创建单条记录求助
问题原因
你当前的写法在add_recipient视图里创建了独立的form_with,生成的嵌套字段没有关联到原表单的@stock_shipment实例,导致name属性缺失父模型前缀和唯一索引,无法被Rails正确识别为多个独立的嵌套属性。
修复步骤
修正控制器,加载StockShipment实例
在stock_shipments_controller.rb的add_recipient方法中,添加实例加载逻辑:def add_recipient @stock_shipment = StockShipment.find(params[:id]) end重写Turbo Stream视图
创建/修改app/views/stock_shipments/add_recipient.turbo_stream.erb,去掉外层多余的form_with,直接基于@stock_shipment生成带唯一索引的嵌套字段:<%= turbo_stream.append 'recipients-list' do %> <%= fields_for :stock_shipment, @stock_shipment do |stock_form| %> <%= stock_form.fields_for :recipients, Recipient.new, child_index: SecureRandom.uuid do |recipient_form| %> <%= render 'shared/recipient_fields', form: recipient_form, new_record: true %> <% end %> <% end %> <% end %>- 使用
SecureRandom.uuid作为child_index,避免快速点击时索引重复的问题 - 通过
stock_form.fields_for关联到原表单的父模型,确保生成的name格式为stock_shipment[recipients][唯一索引][phone]
- 使用
验证局部视图字段
确保shared/_recipient_fields.html.erb中的所有字段都通过传入的form对象生成,比如:<tr> <td><%= form.text_field :phone, placeholder: '手机号' %></td> <td><%= form.text_field :name, placeholder: '姓名' %></td> <% if new_record %> <td> <%= form.hidden_field :_destroy %> <button type="button" class="text-red-500 remove-recipient">删除</button> </td> <% end %> </tr>
这样修改后,新增的每个收件人字段都会带有唯一的索引,提交表单时Rails就能正确识别并创建多条Recipient记录。
内容的提问来源于stack exchange,提问作者user3074558
相关产品推荐
相关产品推荐

