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