Topic title displaying in the URL



I would like to integrate the title string into a URL.

The standard is like:

In view of a good search engine ranking I would like to write the title
of a topic into the URL like:

The problem are special characters like ‘?()&#’ etc. in the title

This is my route thinking:
map.connect ‘:controller/:topictitle’, :controller => ‘topics’, :action
=> ‘show’

Now I need a revokable solution to turn the title into a suiteable form
without special characters which could make problems.

Here is a function that can do the fitting, but it is not revokable, so
I can’t do the Find command in the Controller (topic =
Topic.find(:first, :conditions => [“title = ?”,

def topic_to_url(topic_link)
topic_link = topic_link.gsub(/[ä]/, “ae”)
topic_link = topic_link.gsub(/[ü]/, “ue”)
topic_link = topic_link.gsub(/[ö]/, “oe”)
topic_link = topic_link.gsub(" “, “-”)
topic_link = topic_link.gsub(/[(,.?!;:’”)]/, “”)

Is there a better way to do the integration?
Is there a function to convert strings into url suitable forms which can
undo the hole thing afterwards?
Should I commit also the ID?

I would love to here how you do that…

Greeting, Chaos


The problem are special characters like ‘?()&#’ etc. in the title

topic_link = topic_link.gsub(/[ö]/, “oe”)

I would love to here how you do that…

Take a look at the to_url method of
It handles all of this for you.

Then, if it were me, put your route back to it’s default of using :id
and then in your Topic model do:

def to_param
“#{id} #{title}”.to_url

That will have the affect that for the most part you will get nice
urls like ‘/topics/123-super-cool-topic’ but in the worst case you’ll
still get the id of 123. So in your controller you can simply do:

Topic.find_by_id(params[:id].to_i) # to_i will strip everything after
the dash leaving you with just the id.