Обратный вызов after_destroy не запускается через ActiveAdmin

Я использую ActiveAdmin для бэк-офиса своего приложения, и у меня есть эти три модели:

class Organization
  has_many :organization_collection_relations
  has_many :collections, through: :organization_collection_relations
end

class OrganizationCollectionRelation
  belongs_to :organization
  belongs_to :collection

  after_destroy :do_something
end

class Collection
  has_many :organization_collection_relations
  has_many :organizations, through: :organization_collection_relations
end

На моей странице редактирования для Organization у меня есть и f.input :collections. Проблема возникает, когда я редактирую и систематизирую и, например, удаляю все коллекции. Метод обратного вызова after_destroydo_something не запускается. Поэтому мне нужно найти обходной путь в разделе контроллеров активного файла администратора.

controller do
  def update
    resource = Organization.find(params[:id])
    former_ids = resource.collection_ids
    super
    new_ids = resource.reload.collection_ids
    # my logic here
  end
end

Я думаю, что есть способ лучше справиться с этим ...

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
399
2

Ответы 2

Active Admin имеет также свои собственные обратные вызовы, поэтому вы можете использовать их, как показано ниже, в файле organization.rb в папке администратора.

  after_destroy do |organization|
    # do your stuff
  end

Я сделал это ранее для before_save и after_save. Я не уверен, доступен ли он для after_destroy или нет, вы можете проверить здесь больше об активных обратных вызовах администратора.

Спасибо! Я попробую с after_destroy, но с моделью OrganizationCollectionRelation, которая для меня важна.

cmunozgar 10.10.2018 09:50

У меня не работает обратный звонок. Обратный вызов after_destroy модели OrganizationCollectionRelation не запускается редактированием Organization.

cmunozgar 10.10.2018 09:56

у вас есть файл коллекции организаций Relations.rb в активном админке ??

Vishal 10.10.2018 10:31

Да! Я действительно добавил after_detroy в этот файл.

cmunozgar 10.10.2018 10:41

Не могли бы вы добавить, какой код вы добавили и какую ошибку вы получаете в after_destroy?

Vishal 10.10.2018 10:47

Я не получаю никаких ошибок, обратный вызов after_destroy для OrganizationCollectionRelation не вызывается при редактировании модели Organization и оставляет поле ввода для коллекций пустым, хотя OrganizationCollectionRelation уничтожается, потому что я вижу его в журналах и его нет в базе данных

cmunozgar 10.10.2018 10:53

Он должен работать, но я не понимаю, почему он не работает. Как вы проверяете, идет ли он до метода _destoy или нет? какой отладчик ставишь? Вы используете вложенные формы? как внутри организации форма разрушения OrganizationCollectionRelation? если это так, то можете ли вы также попробовать добавить обратный вызов before_destory в самой модели организации?

Vishal 10.10.2018 11:03

Я знаю, что это странно, но это не работает. Просто чтобы вы знали, я не использую вложенные формы, я использую напрямую ассоциацию. Организация имеет много коллекций и задается в разделе разрешающих параметров Organization в Active Admin collection_ids: [].

cmunozgar 10.10.2018 12:16

Да, вы можете попробовать метод after_destory в файле администратора, например

 after_destroy do |organization|
    organization.organization_collection_relations.each(&:do_something)
  end

Другие вопросы по теме