Rails - collection_check_boxes не вызывает обратные вызовы в модели соединения - PullRequest
0 голосов
/ 01 февраля 2019

Поскольку исходный вопрос не достиг цели, вот переписанная версия, которая лучше описывает проблему.

У меня есть следующие модели:

class LineItem < ApplicationRecord
  has_many :line_item_options, :dependent => :destroy
  has_many :options, through: :line_item_options
end

class LineItemOption < ApplicationRecord
  belongs_to :option
  belongs_to :line_item
  has_many :charges, as: :chargeable, dependent: :destroy

  after_create :build_charges

  def build_charges
    surcharges.each do |surcharge|
     self.charges.create!(
       surcharge_id: surcharge.id,
       name: surcharge.name
     )
    end
  end
end

class Charge < ApplicationRecord
  belongs_to :chargeable, polymorphic: true
end

LineItemOption isмодель соединения, которая соединяет Option (не показан) с LineItem.В некоторых случаях LineItemOption также будет иметь дочернюю модель Charge.

В моей форме LineItem у меня есть следующий код:

= line_item.collection_check_boxes :option_ids, group.options, :id, :name_and_price do |option|
  .checkbox
    = option.check_box(class: "check")
    = option.label

Когда LineItemOption создается с использованием помощника по форме collection_check_boxes, after_create обратный вызов срабатывает, как и ожидалось.Однако, когда LineItemOption уничтожается с использованием этого же помощника формы, обратный вызов не запускается.Чтобы проверить это, я использовал has_many :charges, as: :chargeable, dependent: :destroy, а также обратный вызов before_destroy.В обоих случаях обратные вызовы работают из консоли rails, но не из помощника формы collection_check_boxes.

Глядя на журнал сервера, я вижу, что метод уничтожения вызывается в LineItemOption, который успешно запускается без также запуска соответствующейcallback

LineItemOption Destroy (0.7ms)  DELETE FROM "line_item_options" WHERE "line_item_options"."line_item_id" = $1 AND "line_item_options"."option_id" = $2  [["line_item_id", 12], ["option_id", 1]]
   (1.2ms)  COMMIT
Redirected to http://localhost:3000/orders/6

Я сижу здесь и чешу голову, пытаясь выяснить, что происходит, и как решить эту проблему.Это обычное поведение с collection_check_boxes помощником?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Похоже, что есть ошибка или что-то в рельсах с давних времен, когда обратный вызов after_destroy не запускается, когда вы удаляете записи из has_many :through ассоциации https://github.com/rails/rails/issues/27099 (и я предполагаю, что dependant: :destroy опция зависит от этого обратного вызова).

Вам нужно будет реализовать какое-нибудь хакерское решение, например, перед назначением новых line_items, сделать что-то вроде line_item.line_item_options.destroy_all или line_item.line_item_options.each(&:destroy), чтобы удалить записи вручную, активируя пропперобратные вызовы, а затем обновление записи, чтобы рельсы могли создавать новые ассоциации без глючного поведения destoy.

0 голосов
/ 01 февраля 2019

Вы должны включить:

has_many :line_item_options, :dependent => :destroy

accepts_nested_attributes_for :line_item_options, :allow_destroy => true

Вы должны добавить _destroy в свои параметры:

def line_item_params
     params.require(:line_item).permit(line_item_options_attributes: [ .......,  :_destroy])

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...