我有一个 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 会像其他建议一样自动处理这个问题,但它似乎不起作用。
有什么想法我在这里出错了吗?
您的模型中似乎未定义
accepts_nested_attributes_for
...请参阅 RoR 指南:构建复杂表单。
如果您遇到除此之外的问题,我会注释掉
<%= render 'acts_as_bookable_booking_fields', f: booking_subform %>
并暂时将其替换为“acts_as_bookable_booking_fields”中的内容,以便更轻松地解决是否是表单结构或嵌套的问题。