Skip to content

Instantly share code, notes, and snippets.

@artofhuman
Last active March 29, 2016 18:20
Show Gist options
  • Save artofhuman/04d0795ba1178e3e759febeb914de04a to your computer and use it in GitHub Desktop.
Save artofhuman/04d0795ba1178e3e759febeb914de04a to your computer and use it in GitHub Desktop.
# Callback
class Apress::Demands::Tenders::AcceptTender
include Interator
include ActiveSupport::Callbacks
define_callbacks :accept
def call
run_callbacks :accept do
tender.accept!
end
end
ActiveSupport.run_load_hooks(:'apress/demands/interators/accept_tender', self)
end
# In project mail plugin init.rb
ActiveSupport.on_load(:'apress/demands/interators/accept_tende') { include Extensions::Apress::Demands::Tenders::Accept }
module Extensions::Apress::Demands::Tenders::Accept
extend ActiveSupport::Concern
included do
set_callback :send_mail, :after, :accept
end
def send_mail
....
end
end
# Observer
class Apress::Demands::Tenders::AcceptTender
include Interator
include ActiveModel::Observing
def call
tender.accept!
notify_observers(:after_accept)
end
end
# in project mail plugin init.rb
Apress::Demands::Tenders::AcceptTender.add_observer(MailDeliveries::AcceptTenderObserver.instance)
class MailDeliveries::AcceptTenderObserver < ActionModel::Observer
def after_accept(context)
send_mail(context.tender)
end
end
Callback
+ Обкатаный рабочий метод
- Надо заниматься монки патчингом из проекта целевого класса, что добавлем методы классу о которых он знать не должен.
Observer
+ Патчить исходный объект не надо
- В нашем 3.1 мирке похоже есть бага AwesomeObserver.instance рейзит ошибку так как там вырезается слово Observer из класса, но вот так работает
Awesome.instance. Проверил в геме куда вынесли обсерверы из 4.0 там ошибки нет
@Napolskih
Copy link

по мне особой разницы нет.
для меня калбеки привычней и гибче за счет того что сразу получаешь before/after/around.
с обсервером патчить не надо, но нужна регистрация + класс,
а с колбеком: инклуд + экстеншн.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment