Мой пользовательский метод уничтожения не запускает обратные вызовы по умолчанию до и после уничтожения - PullRequest
0 голосов
/ 21 декабря 2009

Я пишу плагин, который обеспечивает черчение для моделей. Действие удаления - это черновое действие, и я не всегда хочу удалять источник, пока это удаление не будет опубликовано. Поэтому я написал свой собственный метод уничтожения, чтобы помочь с этим. Все работает точно так, как я хочу, за исключением того, что пользовательские обратные вызовы для :before_destroy и :after_destroy больше не запускаются.

Любые идеи о том, как:

  1. привязать обратные вызовы к моему методу уничтожения
  2. работает какой-то alias_method_chain voodoo
  3. получить список обратных вызовов моделей, чтобы я мог называть их ручными
  4. решить эту проблему другим способом

Вот мой метод уничтожения:

  def destroy
    if self.attribute_names.include?('draft') && self.skip_draft == false
      if handle_destroy # if true is returned
        super # go ahead and destroy as normal
      end
    else
      super
    end
  end

Обновление: я только что нашел это: правильный способ переопределить activerecordbasedestroy , но похоже, что предложенный метод также не подходит для обратных вызовов. Есть ли способ взять мой торт и съесть его тоже?

1 Ответ

0 голосов
/ 22 декабря 2009

Я был неправ по поводу того, что обратные вызовы не вызывались при вызове super. Я закончил тем, что полагался на точный код, который я первоначально отправил. Я изменил, как мой метод handle_destroy возвратил

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

  def destroy
    if self.attribute_names.include?('draft') && self.skip_draft == false
      if handle_destroy # if true is returned
        super # go ahead and destroy as normal
      else
        # Execute all custom callbacks that are not dependent type callbacks (ie: if the callback method name contains "dependent")
        #   Dependent callbacks delete records and this is not what the drafting system is all about.
        (self.class.before_destroy_callback_chain + self.class.after_destroy_callback_chain).each do |cb|
          unless (cb.method.kind_of?(Symbol) && cb.method.to_s.match(/dependent/))
            cb.call(self)
          end
        end
      end
    else
      # normal delete
      super
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...