Я использую 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
Я думаю, что есть способ лучше справиться с этим ...





Active Admin имеет также свои собственные обратные вызовы, поэтому вы можете использовать их, как показано ниже, в файле organization.rb в папке администратора.
after_destroy do |organization|
# do your stuff
end
Я сделал это ранее для before_save и after_save. Я не уверен, доступен ли он для after_destroy или нет, вы можете проверить здесь больше об активных обратных вызовах администратора.
У меня не работает обратный звонок. Обратный вызов after_destroy модели OrganizationCollectionRelation не запускается редактированием Organization.
у вас есть файл коллекции организаций Relations.rb в активном админке ??
Да! Я действительно добавил after_detroy в этот файл.
Не могли бы вы добавить, какой код вы добавили и какую ошибку вы получаете в after_destroy?
Я не получаю никаких ошибок, обратный вызов after_destroy для OrganizationCollectionRelation не вызывается при редактировании модели Organization и оставляет поле ввода для коллекций пустым, хотя OrganizationCollectionRelation уничтожается, потому что я вижу его в журналах и его нет в базе данных
Он должен работать, но я не понимаю, почему он не работает. Как вы проверяете, идет ли он до метода _destoy или нет? какой отладчик ставишь? Вы используете вложенные формы? как внутри организации форма разрушения OrganizationCollectionRelation? если это так, то можете ли вы также попробовать добавить обратный вызов before_destory в самой модели организации?
Я знаю, что это странно, но это не работает. Просто чтобы вы знали, я не использую вложенные формы, я использую напрямую ассоциацию. Организация имеет много коллекций и задается в разделе разрешающих параметров Organization в Active Admin collection_ids: [].
Да, вы можете попробовать метод after_destory в файле администратора, например
after_destroy do |organization|
organization.organization_collection_relations.each(&:do_something)
end
Спасибо! Я попробую с
after_destroy, но с модельюOrganizationCollectionRelation, которая для меня важна.