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