Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/steveklabnik/active_record-observers
https://github.com/steveklabnik/active_record-observers
Last synced: 4 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/steveklabnik/active_record-observers
- Owner: steveklabnik
- License: mit
- Created: 2012-08-10T04:19:51.000Z (over 12 years ago)
- Default Branch: master
- Last Pushed: 2012-11-28T23:02:11.000Z (about 12 years ago)
- Last Synced: 2024-12-16T23:03:31.239Z (7 days ago)
- Language: Ruby
- Size: 188 KB
- Stars: 2
- Watchers: 2
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Rails::Observers
Rails Observers (removed from core in Rails 4.0)
## Installation
Add this line to your application's Gemfile:
gem 'rails-observers'
And then execute:
$ bundle
Or install it yourself as:
$ gem install rails-observers
## Usage
This gem contains two observers:
* Active Record Observer
* Action Controller Sweeper### Active Record Observer
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:```ruby
class CommentObserver < ActiveRecord::Observer
def after_save(comment)
Notifications.comment("[email protected]", "New comment was posted", comment).deliver
end
end
```This Observer sends an email when a Comment#save is finished.
```ruby
class ContactObserver < ActiveRecord::Observer
def after_create(contact)
contact.logger.info('New contact added!')
enddef 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.
### Action Controller Sweeper
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:```ruby
class ListSweeper < ActionController::Caching::Sweeper
observe List, Itemdef 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:
```ruby
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:
```ruby
class ListsController < ApplicationController
caches_action :index, :show, :public, :feed
cache_sweeper OpenBar::Sweeper, :only => [ :edit, :destroy, :share ]
end
```## Contributing
1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Added some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request