# Nested routes don't work for me?

**URL:** <https://www.ruby-forum.com/t/nested-routes-dont-work-for-me/145964>\
**Category:** Rails\
**Created:** [August 15, 2008, 4:07pm UTC](https://www.ruby-forum.com/t/nested-routes-dont-work-for-me/145964 "2008-08-15T16:07:39Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![josh](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/45deac/32.png) [@josh](https://www.ruby-forum.com/u/josh)\
**Post date:** [August 15, 2008, 4:07pm UTC](https://www.ruby-forum.com/t/nested-routes-dont-work-for-me/145964/1 "2008-08-15T16:07:39Z")

</div>

Hi all

I’m quite new to RESTful Rails and tried a bit with a new app, but it  
seems I don’t comprehend something yet.

I have the following two models:

class CompactDisc \< ActiveRecord::Base  
belongs\_to :genre  
validates\_presence\_of :genre  
end

class Genre \< ActiveRecord::Base  
has\_many :compact\_discs  
end

In routes.rb I have the following route:

ActionController::Routing::Routes.draw do |map|  
map.resources :compact\_discs

map.resources :genres do |genre|  
genre.resources :compact\_discs, :name\_prefix =\> ‘genre\_’  
end

…  
end

When opening localhost:3000/compact\_discs it shows me all CD’s. When  
opening localhost:3000/genres/1/compact\_discs it still shows me all  
CD’s! Shouldn’t it only display the ones that are associated to genre 1  
now? Or did I miss something?

I also played with

map.resources :genres, :has\_many =\> :compact\_discs

but this didn’t help me neither…

Thanks for help 🙂  
Josh

---

<div class="post-metadata">

**Author:** ![josh](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/45deac/32.png) [@josh](https://www.ruby-forum.com/u/josh)\
**Post date:** [August 15, 2008, 6:02pm UTC](https://www.ruby-forum.com/t/nested-routes-dont-work-for-me/145964/2 "2008-08-15T18:02:59Z")

</div>

On Aug 15, 9:07 am, Joshua M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> end  
> map.resources :genres do |genre|  
> genre.resources :compact\_discs, :name\_prefix =\> ‘genre\_’  
> end
> 
> …  
> end

Those routes look good…

> ## Thanks for help 🙂 Josh
> 
> Posted viahttp://www.ruby-forum.com/.

When you have nested routes, Rails handles _almost_ everything for  
you, but you need to adjust your index action to be aware of the  
“parent” resource:

def index  
if params[:genre]  
@genre = Genre.find(params[:genre])  
@compact\_discs = @genre.compact\_discs  
else  
@compact\_discs = CompactDisc.find(:all)  
end

# continue code here

end

In other words, you want to detect if you’re nested inside a genre,  
and in that case, only show the discs for that genre.

There are more elegant ways to do this, too (many people use a  
before\_filter, etc.)

Does this help at all?

Jeff

REST with Rails: Oct 4, 2008, Austin, TX  
[http://www.purpleworkshops.com/workshops/rest-and-web-services](http://www.purpleworkshops.com/workshops/rest-and-web-services)

---

<div class="post-metadata">

**Author:** ![josh](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/45deac/32.png) [@josh](https://www.ruby-forum.com/u/josh)\
**Post date:** [August 15, 2008, 7:34pm UTC](https://www.ruby-forum.com/t/nested-routes-dont-work-for-me/145964/3 "2008-08-15T19:34:46Z")

</div>

> Does this help at all?
> 
> Jeff

Thanks a lot, Jeff. Can you point me into some “best practices” on how  
to make this work? before\_filter etc…?

---

<div class="post-metadata">

**Author:** ![josh](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/45deac/32.png) [@josh](https://www.ruby-forum.com/u/josh)\
**Post date:** [August 15, 2008, 7:43pm UTC](https://www.ruby-forum.com/t/nested-routes-dont-work-for-me/145964/4 "2008-08-15T19:43:58Z")

</div>

Joshua M. wrote:

> > Does this help at all?
> > 
> > Jeff
> 
> Thanks a lot, Jeff. Can you point me into some “best practices” on how  
> to make this work? before\_filter etc…?

Well, created one myself. You think this is safe and clean/DRY? 🙂

private  
def prepare\_compact\_discs  
genre = (params[:genre\_id] ? Genre.find(params[:genre\_id]) : nil)  
@compact\_discs = (genre ? genre.compact\_discs :  
CompactDisc.find(:all))  
end

Btw, in your example before you should have used params[:genre\_id], not  
only params[:genre]. Thanks anyway.

---

<div class="post-metadata">

**Author:** ![josh](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/45deac/32.png) [@josh](https://www.ruby-forum.com/u/josh)\
**Post date:** [August 15, 2008, 11:56pm UTC](https://www.ruby-forum.com/t/nested-routes-dont-work-for-me/145964/5 "2008-08-15T23:56:15Z")

</div>

> Again, I don’t think there’s a right or wrong necessarily - whatever  
> you think keeps the code the clearest.

Thanks, interesting ways! 🙂 Let’s me feel like a complete newbie again  
and again 😉

---

<div class="post-metadata">

**Author:** ![josh](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/45deac/32.png) [@josh](https://www.ruby-forum.com/u/josh)\
**Post date:** [August 15, 2008, 8:45pm UTC](https://www.ruby-forum.com/t/nested-routes-dont-work-for-me/145964/6 "2008-08-15T20:45:20Z")

</div>

On Aug 15, 12:43 pm, Joshua M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> private  
> def prepare\_compact\_discs  
> genre = (params[:genre\_id] ? Genre.find(params[:genre\_id]) : nil)  
> @compact\_discs = (genre ? genre.compact\_discs :  
> CompactDisc.find(:all))  
> end

It’s probably a matter of taste, but I tend to recommend something  
like this:

before\_filter :find\_genre

def index  
@compact\_discs = @genre ? @genre.compact\_discs ||  
CompactDisc.find(:all)

# …

end

def find\_genre  
@genre = Genre.find\_by\_id(params[:genre\_id]) # returns nil if not  
foun  
end

Some people prefer this:

before\_filter :load\_for\_genre

def index

# Find all discs only if we don’t have any yet

@compact\_discs ||= CompactDisc.find(:all)  
end

def load\_for\_genre  
@compact\_discs = Genre.find(params[:genre\_id]).compact\_discs if  
params[:genre\_id]  
end

Again, I don’t think there’s a right or wrong necessarily - whatever  
you think keeps the code the clearest.

> Btw, in your example before you should have used params[:genre\_id], not  
> only params[:genre]. Thanks anyway.

Good catch.

Jeff

REST with Rails: Oct 4, 2008, Austin, TX  
[http://www.purpleworkshops.com/workshops/rest-and-web-services](http://www.purpleworkshops.com/workshops/rest-and-web-services)
