ruby-on-rails - 带有多个嵌套模型的 Rails 表单会导致 radio 组出现问题

标签 ruby-on-rails radio-button actionview

我遇到了包含单选按钮的嵌套模型表单的问题,当我有多个模型时,所有单选按钮都被视为在同一组中。

我的模型包含这样的 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}"

这在只有一个 child 时工作正常,但是一旦我插入多个 child ,所有单选按钮都属于同一组,因为它们都具有相同的属性 name="order[order_items_attributes][][colour_id]" .这一切都在一个新的模型形式上,所以我不能使用数组索引( name="order[order_items_attributes][0][colour_id]" ),因为 Rails 给出了错误 expected Hash (got Array) for param 'order_items_attributes'最后一部分我错了,错误是因为我混合了索引和非索引名称属性。添加索引值是解决这个问题的关键。

这是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"}],
 "first_name"=>"sdf",
 "last_name"=>"sdf",
 "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 表单会导致 radio 组出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1577631/

相关文章:

ruby-on-rails - Gsub 提出 "invalid byte sequence in UTF-8"

javascript - 单击单选按钮时选中复选框

html - Chrome 上的单选按钮显示

jquery - 为什么我的 jQuery 动画需要在 IE8 中额外单击才能完成?

ruby-on-rails-5 - 导轨 5 : form_for vs form_with

ruby-on-rails - 如何将 node js 应用程序包装到 rails gem 中

JavaScript 或 Rails : How to grab a BLE device or bluetooth

ruby-on-rails - OAuth 与用于导入联系人的可移植联系人

ruby-on-rails - 类 `render' 的未定义方法 `ActionView::Base'

ruby-on-rails-3 - 最新 Rails 3:ActionView::Template::Error(无法解析第 105 行第 13 列的 YAML)