This repository has been archived by the owner on Nov 11, 2017. It is now read-only.
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
ec9acc9
commit 7649db6
Showing
2 changed files
with
123 additions
and
120 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
= DEPRECATED | ||
|
||
This plugin is deprecated. Please upgrade your Rails installation to at least | ||
2.1 to get this functionality, maintained, as well as all the other joys that | ||
come with a Rails upgrade. | ||
|
||
= When | ||
|
||
When adds :if and :unless conditions to ActiveRecord callbacks and validations | ||
and ActionController filters. It works exactly the way as the current | ||
implementation of #validates_acceptance_of. | ||
|
||
It works on the 12 regular callbacks: | ||
|
||
* before_validation | ||
* before_validation_on_create | ||
* after_validation | ||
* after_validation_on_create | ||
* before_save | ||
* before_create | ||
* before_update | ||
* after_create | ||
* after_update | ||
* after_save | ||
* before_destroy | ||
* after_destroy | ||
|
||
3 validations: | ||
|
||
* validate | ||
* validate_on_create | ||
* validate_on_update | ||
|
||
and 1 filter: | ||
|
||
* before_filter | ||
|
||
It works when :if or :unless is passed a Symbol, a Proc or a String. They | ||
return or evaluate to a true or false value. | ||
|
||
== Example | ||
|
||
class Address < ActiveRecord::Base | ||
|
||
before_save :geolocate | ||
|
||
def geolocate | ||
if complete? | ||
... | ||
end | ||
end | ||
|
||
def complete? | ||
street? && city? && state? && zip? | ||
end | ||
|
||
end | ||
|
||
In this case, we want to find the latitude and longitude of an address only if | ||
the address is complete. | ||
|
||
Wrapping the entirety of a callback method with conditional logic is bad form. | ||
The callback should execute WHEN the model's life cycle reaches its | ||
"before_save" point and WHEN its address is "complete." | ||
|
||
With When, the WHEN responsibility is moved to where it belongs: as part of the | ||
callback. | ||
|
||
class Address < ActiveRecord::Base | ||
|
||
before_save :geolocate, | ||
:if => :complete? | ||
|
||
def geolocate | ||
... | ||
end | ||
|
||
def complete? | ||
street? && city? && state? && zip? | ||
end | ||
|
||
end | ||
|
||
before_create's single responsibility is to execute code WHEN certain | ||
conditions are met. geolocate's single responsibility is to ... geolocate. It | ||
should not contain its own preconditions. | ||
|
||
== More Examples | ||
|
||
before_create :encrypt_password, | ||
:unless => lambda {|user| user.password_confirmation.blank?} | ||
|
||
before_filter :log_in!, | ||
:only => [:new, :create], | ||
:unless => :logged_in? | ||
|
||
== What When does NOT support | ||
|
||
# ActiveRecord Class callbacks | ||
before_create PasswordEncryptor, | ||
:unless => lambda {|user| user.password_confirmation.blank?} | ||
|
||
# ActionController Class filters | ||
before_filter Authorizer, | ||
:unless => :logged_in? | ||
|
||
When will not work if your code contains any of these. | ||
|
||
In our experience we've never used class callbacks or filters and find them to | ||
be overkill. | ||
|
||
== Obsolete after Rails 2.0.3 | ||
|
||
Whenever the next release after Rails 2.0.2 comes out, this feature will be | ||
baked into Rails via the ActiveSupport::Callbacks module. Happy coding! | ||
|
||
== Installation | ||
|
||
piston import https://svn.thoughtbot.com/plugins/when/trunk vendor/plugins/when | ||
|
||
== Copyright | ||
|
||
Copyright (c) 2008 Jared Carroll, Dan Croak, and thoughtbot, inc. released under the MIT license |