Topic title displaying in the URL

Hi

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

The standard is like: www.bla.xyz/topics/1

In view of a good search engine ranking I would like to write the title of a topic into the URL like: www.bla.xyz/topics/super-cool-topic

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

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 = ?", topic_title]))afterwards.

def topic_to_url(topic_link)     topic_link.to_s     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(/[(,.?!;:'")]/, "")     topic_link.downcase end

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

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

The standard is like: www.bla.xyz/topics/1

In view of a good search engine ranking I would like to write the title of a topic into the URL like: www.bla.xyz/topics/super-cool-topic

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

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 = ?", topic_title]))afterwards.

def topic_to_url(topic_link)    topic_link.to_s    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(/[(,.?!;:'")]/, "")    topic_link.downcase end

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...

Take a look at the to_url method of GitHub - rsl/stringex: Some [hopefully] useful extensions to Ruby’s String class. It is made up of three libraries: ActsAsUrl [permalink solution with better character translation], Unidecoder [Unicode to Ascii transliteration], and StringExtensions [miscellaneous helper methods for the String class]. 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    rescue      id    end

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.

-philip