为什么这个 has_many :through collection_check_boxes 表单输入不能正确创建记录?

问题描述 投票:0回答:1

我有一个 has_many :通过 Rails 7 应用程序中的关联设置。

我正在使用 ActsAsBookable gem 来处理活动预订。可以从预订中添加的事件 has_many EventExtras,以及预订 has_many SelectedExtras。由于 ActsAsBookable gem,增加了一点点复杂性。

我会将代码示例缩减为相关部分

module BookingMonkeyPatch
  extend ActiveSupport::Concern
  included do
    has_many :selected_extras, foreign_key: "acts_as_bookable_booking_id", dependent: :destroy
    has_many :event_extras, through: :selected_extras
    belongs_to :booking_set, optional: true
  end
end
ActsAsBookable::Booking.include(BookingMonkeyPatch)
class EventExtra < ApplicationRecord
  belongs_to :event
  has_many :selected_extras
  has_many :acts_as_bookable_bookings, through: :selected_extras, class_name: "ActsAsBookable::Booking", foreign_key: "acts_as_bookable_booking_id"
end
class SelectedExtra < ApplicationRecord
  belongs_to :event_extra
  belongs_to :acts_as_bookable_booking, foreign_key: "acts_as_bookable_booking_id", class_name: "ActsAsBookable::Booking"
end
class Event < ApplicationRecord
  has_many :event_extras, dependent: :destroy
end
class BookingSet < ApplicationRecord
  has_many :acts_as_bookable_bookings, class_name: "ActsAsBookable::Booking", foreign_key: "booking_set_id"
end

在我的表单中,我使用以下内容:

<%= simple_form_for @booking_set, data: {turbo: "false"} do |form| %>

  <%= form.input :user_id, as: :hidden, input_html: { value: @user.id } %>
  <%= form.simple_fields_for :acts_as_bookable_bookings do |booking_subform| %>
    <%= render 'acts_as_bookable_booking_fields', f: booking_subform %>
  <% end %>
  <%= link_to_add_fields "Add Another Booking", form, :acts_as_bookable_bookings, "build_shoot" if @bookers&.size > 1 %>

<% end %>

然后在嵌套表单中,我有:

<%= f.collection_check_boxes :event_extra_ids, @selected_event.event_extras, :id, :name, {}, { :multiple => true } %>

这个效果很好。这种形式又嵌套了 2 层,并且所有嵌套都工作正常。我遇到的问题是,当我尝试提交包含所选附加内容之一的表单时,我收到一个验证错误,该错误本质上是为了创建

SelectedExtra
,它需要一个
acts_as_bookable_booking_id

这在某些方面对我来说是有道理的。查看提交的参数,它只是

event_extra_ids => {"24", "25"}
。为了创建 SelectedExtra,它还需要知道所选额外费用的预订用途。我认为 collection_select 或 collection_check_boxes 会像其他建议一样自动处理这个问题,但它似乎不起作用。

有什么想法我在这里出错了吗?

ruby-on-rails ruby simple-form nested-forms has-many-through
1个回答
0
投票

您的模型中似乎未定义

accepts_nested_attributes_for
...请参阅 RoR 指南:构建复杂表单

如果您遇到除此之外的问题,我会注释掉

<%= render 'acts_as_bookable_booking_fields', f: booking_subform %>
并暂时将其替换为“acts_as_bookable_booking_fields”中的内容,以便更轻松地解决是否是表单结构或嵌套的问题。

© www.soinside.com 2019 - 2024. All rights reserved.