# Simplifying RESTful urls

**URL:** <https://www.ruby-forum.com/t/simplifying-restful-urls/112504>\
**Category:** Rails\
**Created:** [August 20, 2007, 11:55am UTC](https://www.ruby-forum.com/t/simplifying-restful-urls/112504 "2007-08-20T11:55:16Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![daz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/87869e/32.png) [@daz](https://www.ruby-forum.com/u/daz)\
**Post date:** [August 20, 2007, 11:55am UTC](https://www.ruby-forum.com/t/simplifying-restful-urls/112504/1 "2007-08-20T11:55:16Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![daz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/87869e/32.png) [@daz](https://www.ruby-forum.com/u/daz)\
**Post date:** [August 20, 2007, 5:04pm UTC](https://www.ruby-forum.com/t/simplifying-restful-urls/112504/2 "2007-08-20T17:04:27Z")

</div>

Don’t use the built-in RESTful routing. 🙂 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

On 8/20/07, DAZ [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> /programmes/4/episodes/5
> 
> Thanks,
> 
> DAZ
> 
> >

–  
[http://www.jeremymcanally.com/](http://www.jeremymcanally.com/)

My free Ruby e-book:  
[http://www.humblelittlerubybook.com/book/](http://www.humblelittlerubybook.com/book/)

My blogs:

> **[Site not found · DreamHost](http://www.mrneighborly.com/)**
>
> The owner of this domain has not yet uploaded their website.

[http://www.rubyinpractice.com/](http://www.rubyinpractice.com/)

---

<div class="post-metadata">

**Author:** ![daz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/87869e/32.png) [@daz](https://www.ruby-forum.com/u/daz)\
**Post date:** [August 20, 2007, 6:36pm UTC](https://www.ruby-forum.com/t/simplifying-restful-urls/112504/3 "2007-08-20T18:36:47Z")

</div>

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 🙂

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

David

–

- Books:  
RAILS ROUTING (new! [http://www.awprofessional.com/title/0321509242](http://www.awprofessional.com/title/0321509242))  
RUBY FOR RAILS ([Ruby for Rails](http://www.manning.com/black))
- Ruby/Rails training  
& consulting: Ruby Power and Light, LLC ([http://www.rubypal.com](http://www.rubypal.com))

---

<div class="post-metadata">

**Author:** ![daz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/87869e/32.png) [@daz](https://www.ruby-forum.com/u/daz)\
**Post date:** [September 25, 2007, 11:04pm UTC](https://www.ruby-forum.com/t/simplifying-restful-urls/112504/4 "2007-09-25T23:04:09Z")

</div>

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.

HTH,  
AndyV

---

<div class="post-metadata">

**Author:** ![daz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/87869e/32.png) [@daz](https://www.ruby-forum.com/u/daz)\
**Post date:** [February 11, 2008, 10:38am UTC](https://www.ruby-forum.com/t/simplifying-restful-urls/112504/5 "2008-02-11T10:38:49Z")

</div>

I m looking for the same…

---

<div class="post-metadata">

**Author:** ![daz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/87869e/32.png) [@daz](https://www.ruby-forum.com/u/daz)\
**Post date:** [February 11, 2008, 10:40am UTC](https://www.ruby-forum.com/t/simplifying-restful-urls/112504/6 "2008-02-11T10:40:22Z")

</div>

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
