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

This then produces urls like so:


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


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




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

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.


On 8/20/07, DAZ [email protected] wrote:




My free Ruby e-book:

My blogs:

Hi –

On Mon, 20 Aug 2007, Jeremy McAnally wrote:

This then produces urls like so:

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.


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

class Episode

def to_param

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

Now your call to episode_path should produce:


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


I m looking for the same…

Naresh Rana wrote:

I m looking for the same…


i want to make my url look likie this,