Rails Observers (removed from core in Rails 4.0)
Add this line to your application's Gemfile:
gem 'rails-observers'
And then execute:
$ bundle
Or install it yourself as:
$ gem install rails-observers
This gem contains two observers:
- Active Record Observer
- Action Controller Sweeper
Observer classes respond to life cycle callbacks to implement trigger-like behavior outside the original class. This is a great way to reduce the clutter that normally comes when the model class is burdened with functionality that doesn't pertain to the core responsibility of the class. Example:
class CommentObserver < ActiveRecord::Observer
def after_save(comment)
Notifications.comment("admin@do.com", "New comment was posted", comment).deliver
end
end
This Observer sends an email when a Comment#save is finished.
class ContactObserver < ActiveRecord::Observer
def after_create(contact)
contact.logger.info('New contact added!')
end
def after_destroy(contact)
contact.logger.warn("Contact with an id of #{contact.id} was destroyed!")
end
end
This Observer uses logger to log when specific callbacks are triggered.
Sweepers are the terminators of the caching world and responsible for expiring caches when model objects change. They do this by being half-observers, half-filters and implementing callbacks for both roles. A Sweeper example:
class ListSweeper < ActionController::Caching::Sweeper
observe List, Item
def after_save(record)
list = record.is_a?(List) ? record : record.list
expire_page(:controller => "lists", :action => %w( show public feed ), :id => list.id)
expire_action(:controller => "lists", :action => "all")
list.shares.each { |share| expire_page(:controller => "lists", :action => "show", :id => share.url_key) }
end
end
The sweeper is assigned in the controllers that wish to have its job performed using the cache_sweeper
class method:
class ListsController < ApplicationController
caches_action :index, :show, :public, :feed
cache_sweeper :list_sweeper, :only => [ :edit, :destroy, :share ]
end
In the example above, four actions are cached and three actions are responsible for expiring those caches.
You can also name an explicit class in the declaration of a sweeper, which is needed if the sweeper is in a module:
class ListsController < ApplicationController
caches_action :index, :show, :public, :feed
cache_sweeper OpenBar::Sweeper, :only => [ :edit, :destroy, :share ]
end
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Added some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request