Simple problem with Resources Routes

Ok, I’m quite near to grasp all the resources and related routing affair…

There is, anyway, a problem that I’m not able to solve: I do not get the picture, here.

I have Offers, and I have Categories… (offers are categorized)

Offers could be listed and shown alone, so you have: /offers/23 or /offers and even /offers.rss

The problem comes when I try to get the Offers related to some Category

The REST way is /categories/32/offers but it won’t work… I can’'t (or I don’t know

how) use offers_url … or many other url helper that worked without nesting…

Here it is my current (not working) routes.rb

map.connect ‘’, :controller => ‘offers’

map.resources :offers, :new => { :new => :any, :preview => :post }

map.resources :categories do |categories|
categories.resources :offers

You need a name prefix if you’re specifying resources multiple times. A suggestion for your situation:

map.connect ‘’, :controller => ‘offers’

map.resources :offers, :new => { :new => :any, :preview => :post }, :name_prefix => ‘all_’

map.resources :categories do |categories|
categories.resources :offers

This gives you all_offers_path and categories_offers_path along with the URLs of “/offers” and “/categories/12/offers” and all related variations.



The problem is that the routes conflict. The way to get the routes
untangled is to use :name_prefix => 'something_' and
possibly :path_prefix => '/something/:some_id'. I wanted to
experiment with this to see what all is necessary, because I've been
facing this in my own application.

The trick, once I got my routes untangled, was to make sure the views
and the controller stays untangled too. If I were in your
application, I'd probably create a:

before_filter :find_category

and then

def find_category
  @category = nil
  @category = Category.find(params[:category_id]) if

Then, when you call all the orders_url and order_url(@order), etc. in
your controller and views, you'll put a conditional there, to pass
@category if @category (like @category ? order_url(@category,
@order) : order_url(@order).

Does that make sense?

To summarize, you'll want to create the nested resources
with :name_prefix, and you'll want to know what kind of url you'll be

If you find a cleaner way to keep your routes untangled in your views
and controllers, please let me know. I'm going to have this
everywhere in an app I'm working on.


@Jason: your solution worked flawlessy :slight_smile: What I did missed, was that the “all_” would go prefixed to the helpers… silly me

@David, thank you for your considerations! I’ve indeed resolved all my problems

with the before_filter in my offers_controller, just before your mail arrived :slight_smile:
But I don’t understand why you’d need all those conditionals…
Once I have the “all_” prefix (that now I understand), all my helpers worked

as in:

all_offers_url() -> /offers
offers_url(@category) -> /categories/23/offers
all_offer_url(@offer) -> /offers/44

They are a bit verbose, but they make definitely sense to me.

Am I missing something?

It's elegant. I like it. This has been something that I've been
wondering about for a while, but haven't had time to implement. When
I found the answer the other day, I was dying to try it out, but got
called away. Thanks both of you.