Skip to content
This repository has been archived by the owner on Nov 11, 2017. It is now read-only.

Conditional checks on Rails filters. The same functionality was added to Rails 2.1, so this is only necessary for pre-Rails 2.1 apps.

License

thoughtbot/when

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

47 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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 svn.thoughtbot.com/plugins/when/trunk vendor/plugins/when

Copyright © 2008 Jared Carroll, Dan Croak, and thoughtbot, inc. released under the MIT license

About

Conditional checks on Rails filters. The same functionality was added to Rails 2.1, so this is only necessary for pre-Rails 2.1 apps.

Resources

License

Code of conduct

Stars

Watchers

Forks

Releases

No releases published

Sponsor this project

 

Packages

No packages published

Languages