Simplifying RESTful urls

Hi, If I am making an application that has a programmes model which has many episodes, and use nested resourses like so:

map.resources :programmes do |programmes|   programmes.resources :episodes end

This then produces urls like so:

/programmes/4/episodes/5

If I then use permalins, I can get them to look like this:

/programmes/simpsons/episodes/bart-the-general

Is there any way of removing the references to the models in the url? So the url would look like:

/simpsons/bart-the-general

Thanks,

DAZ

Don't use the built-in RESTful routing. :slight_smile: Or define your own custom routes:

map.connect ':show_name/:episode_id', :controller => 'episodes', :action => 'show'

I'm not sure that's a valid route, but it would look something like that. In theory, that would minimize the amount of code you'd need to change in your controllers.

--Jeremy

Hi --

Hi, If I am making an application that has a programmes model which has many episodes, and use nested resourses like so:

map.resources :programmes do |programmes|   programmes.resources :episodes end

This then produces urls like so:

/programmes/4/episodes/5

If I then use permalins, I can get them to look like this:

/programmes/simpsons/episodes/bart-the-general

Is there any way of removing the references to the models in the url? So the url would look like:

/simpsons/bart-the-general

Don't use the built-in RESTful routing. :slight_smile: Or define your own custom routes:

map.connect ':show_name/:episode_id', :controller => 'episodes', :action => 'show'

I'm not sure that's a valid route, but it would look something like that. In theory, that would minimize the amount of code you'd need to change in your controllers.

It's valid route, but it's a bit "greedy", in the sense that if you also had:

   map.connect ':actor_name/:movie_id'

or something, you'd have two ':wildcard/:wildcard' routes, of which the first to be defined would "win" for all 'x/y' URLs. This may or may not become a problem in a given application, but I've found that it does tend to become one :slight_smile:

You could tweak it with regex matching for the various wildcards, if that's appropriate.

David

Not only that, but the routes that include the resource names might be very handy with respect to SEO. That is, you might get higher on a list for someone searching for a "Simpsons episode..." if your url includes both.

If using the name, rather than the id, is something that you can commit to as a universal design decision for your urls then there's a pretty easy way to make the pretty urls without changing the routing. ActiveRecord objects make use of the 'to_param' method when they are used as parameters to a method call. By default they return the record id. That's why the call:

episode_path(@simpsons, @bart_the_general)

comes out like /programmes/4/episodes/5

If you simply override the method then you can use the same routing but the names instead:

class Programme   ...   def to_param     self.name.dasherize   end end

class Episode   ...   def to_param     self.name.dasherize   end end

(Having written that twice I see a refactoring coming on... :slight_smile:

Now your call to episode_path should produce:

/programmes/simpsons/episode/bart-the-general

The remaining work to be done is to update your controllers, making them capable of finding the objects based on the dasherized name.

HTH, AndyV

I m looking for the same...

Naresh Rana wrote:

I m looking for the same...

/domain/action/id/title

i want to make my url look likie this,

/domain/action/title