---
title: against convention
teaser:
tags: web,rails
author: Jared Carroll
published_on: 2007-07-19
---

In Rails we have these nice things we can use in our controllers called filters.
A filter is simply a method that will get executed before, after or around the
execution of a specific action in a controller.  After looking at a bunch of
different Rails apps, I never liked any of the names given to these filter
methods.

For example:

```ruby
class UsersController < ApplicationController

  before_filter :ensure_logged_in

  def show
    @user = User.find params[:id]
  end

 private

  def ensure_logged_in
    unless session[:user_id]
      flash[:notice] = 'You must log in'
      redirect_to new_session_path
    end
  end

end
```

I've seen this technique of prefixing the word 'ensure' to filter names.  I
think this sucks and results in long ugly method names.

I've also seen this:

```ruby
class UsersController < ApplicationController

  before_filter :require_logged_in

  def show
    @user = User.find params[:id]
  end

 private

  def require_logged_in
    unless session[:user_id]
      flash[:notice] = 'You must log in'
      redirect_to new_session_path
    end
  end

end
```

Prefixing all filter names with 'require'.  Same thing as 'ensure'; long ugly
method names.

I've adopted the following convention:

```ruby
class UsersController < ApplicationController

  before_filter :logged_in?

  def show
    @user = User.find params[:id]
  end

 private

  def logged_in?
    unless session[:user_id]
      flash[:notice] = 'You must log in'
      redirect_to new_session_path
    end
  end

end
```

Now this flies in the face of normal Ruby use of the '?' operator, i.e. it
should only be used for query methods (methods that return a boolean).  But it
reads so much better and the method name is nice and short.
