Introducing Vanities for Rails 3

When working on a recent “top secret” project, I decided that my users needed vanity URLs. So, a user would have a “vanity name” of “foo”, and then requests to http://example.com/foo would need to redirect to that user’s profile (i.e. http://example.com/users/1). So I built a simple interface for doing that.

Then I thought, “hey, somebody could find this useful as a gem.” So I made one.

Vanities is a Rails 3 gem that gives you a quick and easy way to set up a model-agnostic system for vanity URLs throughout your Rails app.

It’s available as a gem via rubygems, and open source through GitHub.

A Quick Walkthrough

Vanities is meant to be really simple and easy to use.  It’s not at all a groundbreaking, revolutionary concept or anything, merely a convenience for what could otherwise be a pain-in-the-ass kind of setup.  Ergo, using it is a piece of cake.

Let’s start by creating a new Rails 3 application.  This application is going to be a very (and by very I mean “extremely”) simple scaffold of users.  We won’t be bothering with authentication or encrypted passwords, etc. in this example, as it’s just an example.  But in reality, of course you’d have all that stuff.

Start by creating a new Rails application:

rails new mytestapp
cd mytestapp

The first thing we need to do is tell Bundler to use Vanities.  Open your Gemfile and add this code:

gem 'vanities'

Next, do

bundle install

Next, create a User scaffold.  This is what will allow us to see Vanities working.

rails g scaffold user

Now, open the database migration for User and make it look like this:

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string        :name
      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

Next, open app/views/users/show.html.erb and make it look like this:

<p id="notice"><%= notice %></p>

<h1><%= @user.name %></h1>

<%= link_to 'Edit', edit_user_path(@user) %> |
<%= link_to 'Back', users_path %>

Now, type this in your terminal:

rails g vanities

This installs Vanities for you, including the route and controller responsible for making it all work.  There’s only one more minor bit of code left to write – the has_vanity method.  Open app/models/user.rb and make it look like this:

class User < ActiveRecord::Base
  has_vanity
end

Finally, go back to your terminal and migrate your database:

rake db:migrate

Setting Up a Fake User

Now that we have Vanities set up, let’s create a fake user to illustrate.  Issue the following commands in your terminal:

rails c
u = User.new(:name => “J. Austin Hughey”) # your name is fine here, too
u.vanity = Vanity.new(:name => “jah”) # you can use your initials here if you want
u.save

We just used the Rails console to create a user and a vanity for it, then saved it.  This is necessary for our next step:

rails s

Now, go to http://localhost:3000/jah in your browser.  You’ll be automatically redirected to the user’s view page.  Welcome to Vanities! :)

About these ads

One thought on “Introducing Vanities for Rails 3

  1. I am running Rails 3.1 and when I add ‘has_vanity’, and i keep getting this error:

    undefined local variable or method `has_vanity’ for #

    Any ideas what I can do to fix this? I did everything else, including running the rake db:migrate and I have the vanities table. Everything else worked fine – including creating a user with a vanity.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s