Ruby   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ruby-on-rails – 具有多个嵌套模型的Rails表单会导致无线电组出现问题大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我遇到了包含单选按钮的嵌套模型表单的问题,当我有多个模型时,所有单选按钮都被视为在同一组中.

我的模型包含像这样的has_many关系:

class Order < ActiveRecord::Base
    has_many :order_items
    accepts_nested_attributes_for :order_items
end

Class OrderItem < ActiveRecord::Base
    belongs_to :order
end

然后我有一个部分使用创建OrderItem模型表单

<% fields_for "order[order_items_attributes][]",order_item do |f| %>

并且在此表单中包含一组在for循环中创建的单选按钮

radio_button_tag "order[order_items_attributes][][colour_id]","#{Colour.iD}"

当只有一个子节点时,这样可以正常工作,但是当我插入多个子节点时,所有单选按钮都属于同一个组,因为它们都具有相同的属性名称=“Order [order_items_attributes] [] [colour_id]”.这都是在一个新的模型表单上,所以我不能使用数组索引(name =“Order [order_items_attributes] [0] [colour_id]”)因为Rails为参数’order_items_attributes’提供了预期的错误Hash(got Array)我是关于最后一部分的错误,错误是因为我混合了索引和非索引的名称属性.添加索引值是解决这个问题的关键.

当只有一个嵌套模型存在时,以下是params [:order]哈希的内容:

{"order_items_attributes"=>
  [{"size"=>"small","colour_id"=>"4"],"first_name"=>"sdf","last_name"=>"sdf","email"=>"sdfg@sgf.com"}

当存在两个嵌套模型时:

{"order_items_attributes"=>
  [{"size"=>"small","colour_id"=>"4"},{"size"=>"small"}],"email"=>"sdfg@sgf.com"}

正如您所看到的,只有第一个order_item具有colour_id属性.无论选择的单选按钮属于哪种型号(这都是有意义的),都会发生这种情况.

如何渲染单选按钮,以便为每个子模型创建单独的组?

解决方法

调用fields_for时,必须为每个订单项指定唯一索引.如果以这种方式调用fields_for,则需要跟踪传递给fields_for的数组的索引. Rails可以使用嵌套表单为您完成此操作.

解决方案是使用嵌套表单.

<%form_for :order do |f|%>
  Form stuff for this particular order.
  If @order.order_items is empty you may need to build one before the next line.
  <%f.fields_for :order_items do |oi_f| %>
    Form stuff for this particular order_item (prefixed with oi_f.)
    <%Colour.all.each do |colour| %>
      <%=oi_f.radio_tag(:colour_id,colour.id)%>
    <%end%>
  <%end%>
<%end%>

看起来你要发布到orders_controller,所以这应该是一个替代品.

大佬总结

以上是大佬教程为你收集整理的ruby-on-rails – 具有多个嵌套模型的Rails表单会导致无线电组出现问题全部内容,希望文章能够帮你解决ruby-on-rails – 具有多个嵌套模型的Rails表单会导致无线电组出现问题所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。