Trivial friendly URL routing for Ruby on Rails 2009-08-28
Back to the times I was programming in PHP (it hasn’t been that long but it feels like an eternity has passed), I worked in a company own made CMS. One of my biggest headaches was tuning and reimplementing the friendly URL generator.
Having the need to implement friendly URLs for a little and very specific CMS using Rails I found that it was a trivial matter. So I basically came up with a model acting as a tree (let’s call it Page), a route and a class method.
First thing I did was creating a model Page with the fields I needed plus, a slug
string field, plus a parent_id
integer field. I installed the acts_as_tree
plugin and made my model use it.
Then I set up a route:
- map.connect '*slugs', :controller => 'pages', :action => 'show'
Next thing was creating a class method to process the slugs chain:
- class Page < ActiveRecord::Base
- def self.locate_by_slugs(slugs, parent_id=nil)
- page = if slugs.size == 1
- Page.find_by_slug_and_parent_id!(slugs.first, parent_id)
- else
- parent_page = Page.find_by_slug!(slugs.shift, :select => 'id')
- Page.locate_by_slugs(slugs, parent_page.id)
- end
- end
- end
Lastly, I created the show action on PagesController:
- class PagesController < ApplicationController
- def show
- @page = Page.locate_by_slugs(params[:slugs].dup)
- end
- end
Well, I haven’t carried out a revolution, it’s nothing fancy, it’s been done a million times before, I don’t even talk about the slug generation process. This post is just another evidence of how amazing the Ruby on Rails framework is.