Published On: March 5th, 20112.3 min read

By default Rails generate URL with ID. In short to_param method returns a string, which Action Pack uses for constructing an URL to this object. The default implementation returns records’ id as a string.

Suppose, we have a Category model. The routes.rb will look like:

[sourcecode language=”ruby”]map.resources :categories[sourcecode] In categories.rb controller:[sourcecode language=”ruby”] @category = Category.find(1)[sourcecode] In view index.html.erb:[/sourcecode language=”ruby”] [/sourcecode] This will generate the URL: /category/1

While working on building a website Khan Academy In Bangla as a part of the translation project of Khan Academy, I realized that a SEO friendly URL is mandatory. In this website, I have categories like physics, biology or math and tutorials under each category. In order to make the user friendly URL I needed to overwrite to_param method in model.

In order to make it SEO friendly, in Category.rb model I added the line:

[sourcecode language=”ruby”] def to_param
“#{id}-#{title.downcase.gsub(/[^a-zA-Z0-9]+/, ‘-‘).gsub(/-{2,}/, ‘-‘).gsub(/^-|-$/, ”)}”
end[/sourcecode] The regular expression will remove any special character. It generates the url: /category/1-biology. Looks better, right?

Although the URL has become SEO friendly now but this method has some drawbacks. To summarize some:

1. It appends the id with the name. If we remove ID, then maintaining uniqueness will be a problem
2. If the title field is edited then the URL will be changed causing SEO to break.
3. For a large application, it will not be feasible to overwrite to_param in tons of model.

In this point, I found a nice plugin/gem to make all these pretty simple and it is friedly_id . It will do all the work for you with some simple steps. For my system what I did were:

1. Install the gem

[sourcecode language=”ruby”] gem install friendly_id[/sourcecode]

2. In environment.rb include the gem

[sourcecode language=”ruby”] require ‘friendly_id’[/sourcecode]

3. Generate friendly_id by going to my application directory

[sourcecode language=”ruby”] cd khanacademybangla
script/generate friendly_id[/sourcecode]

4. Run the migration

[sourcecode language=”ruby”] rake db:migrate[/sourcecode]

5. Add has_friendly_id to the models which I am looking for to generate user friendly id

[sourcecode language=”ruby”] class Category true

6. Run a rake task to generate slugs for existing records

[sourcecode language=”ruby”] rake friendly_id:make_slugs MODEL=ModelName[/sourcecode]

For my example it was:

[sourcecode language=”ruby”] rake friendly_id:make_slugs MODEL=category[/sourcecode]

That’s it! Now we will be able to see a completely SEO friendly url: /category/biology

I am yet to push my code to production! You need to wait till tomorrow to see it live.

Contributor: Fuad Bin Omar, COO, Nascenia

Share it, Choose Your Platform!
Categories: Blog, TechnologyTags:

More to Explore

The Quest for Knowledge Continues. Fuel Your Curiosity.