Killing observers
- decreases startup time by not loading all your models
- makes it possible to preload config/environment.rb and still test models -> spin/zeus
- makes dependencies obvious
- replaces ActiveRecord magic with ruby
- makes your app Rails 4 ready
Before:
# config/environment.rb
config.observers = [:foo_observer]
# app/observers/foo_observer.rb
class FooObserver < ActiveRecord::Observer
observes :user
def after_save(user)
....
end
end
After:
# app/models/user.rb
class User < ActiveRecord::Base
include FooObserver
end
# app/observers/foo_observer.rb
module FooObserver
class << self
def included(base)
this = self
base.after_save{|user| this.more_descriptive_name(user) }
end
def more_descriptive_name(user)
...
end
end
end
Or, even simpler / easier to test, you can use a callback class (check ActiveRecord::Callbacks docks, but basically you call before_save with an object that respons to before_save etc)
Nice idea, definitely simpler when there is only 1 action like before_save etc, and 1 less include is always nice, not sure if it’s still the best solution when there are multiple callbacks like before_save and before_create
Just tried in in a bigger project and it works nicely for 1 observer vs 1 item, but as soon as I got to multiple items I felt like repeating the before|after_save|update|destroy knowledge -> felt un-dry