Welcome to Giant Robots Smashing Into Other Giant Robots — a weblog about development, business, design and technology — written by thoughtbot.
When, a Rails plugin
Ever write this?1 2 3 4 5 6 7 8 9 10 |
before_filter :authorize protected def authorize unless logged_in? session[:return_to] = request.request_uri redirect_to login_url and return false end end |
1 2 3 4 5 6 7 8 |
before_filter :authorize, :unless => logged_in? protected def authorize session[:return_to] = request.request_uri redirect_to login_url and return false end |
This is more expressive. The conditional logic is no longer hidden in the method.
The authorize method now has a single responsibility: to authorize. The before_filter, responsible for performing some action before your controller action is called, is now smarter about when it is supposed to run.
Introducing When
The When Rails plugin adds :if and :unless modifiers to before_filters, most ActiveRecord callbacks, and validations.
Get it:
piston import https://svn.thoughtbot.com/plugins/when/trunk vendor/plugins/when
Then start improving your controllers:
1 2 3 4 5 6 7 8 9 10 11 12 |
before_filter :deny_access, :unless => :admin? protected def deny_access flash[:failure] = "You do not have access to that page." redirect_to home_url end def admin? logged_in? and current_user.admin? end |
1 2 3 4 5 6 7 |
before_create :encrypt_password, :unless => lambda {|user| user.password_confirmation.blank?} after_save :send_alerts, :if => :alerts? validate_on_create :add_unsupported_type_error, :unless => lambda {|document| SUPPORTED_FILE_TYPES.include? document.file_type} |
Coding without ifs?
Jared makes a strong argument that this is actually removing conditional logic from your program. I tend to agree.
It reminds me of defining constants in your environments so you don’t write conditional logic that checks the RAILS_ENV. That kind of control flow belongs in the framework.
Whether this is removing conditional logic is moot, though. It just feels right, and isn’t that why we write Ruby?
Update ... After releasing this, we found out this is already in Rails trunk. Awesome! It’s a great feature and should be in the framework. So, if you’re not running on Edge, use the when plugin to get this feature now. Then, remove it when you upgrade to the next version of Rails, when you’ll get :ifs and :unlesses “for free.” Happy coding!
About this entry
You're reading an entry on GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS, the company weblog of thoughtbot, inc.
- Author:
- Dan Croak
- Published:
- February 15th 01:05 AM
- Updated:
- February 16th 02:36 AM
- Sections:
- Development Technology
thoughtbot is hiring
We are hiring web developers and web designers in both Boston and New York, NY.
What are we up to?
We built Shoulda, an eclectic set of additions to Test::Unit; Paperclip to manage uploaded files without hassle; Jester, a REST/ActiveResource client library written in Javascript, and Squirrel, an enhancement for ActiveRecord's find syntax; — amongst some other projects.

Chad (President) and Jon (CTO) co-authored a technical book titled Pro Active Record: Databases with Ruby and Rails, which explores the ins and outs of the ActiveRecord ruby library. You can buy it today at Amazon.com.
About thoughtbot, inc.
We are a small web application development consulting business, with offices in Boston, MA and New York, NY. If you're looking to find a team for your next web development project or your new web application — get in touch.
13 comments
Jump to comment form