Simple problem with Resources Routes

0 views
Skip to first unread message

Ruby Rails

unread,
May 3, 2007, 5:18:26 PM5/3/07
to rubyonra...@googlegroups.com
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
map.resources :offers, :new => { :new => :any, :preview => :post }

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



--
Claudio Cicali

Jason Roelofs

unread,
May 3, 2007, 5:21:33 PM5/3/07
to rubyonra...@googlegroups.com
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
end

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

Jason

David Richards

unread,
May 3, 2007, 6:02:37 PM5/3/07
to Ruby on Rails: Talk
Claudio,

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
params[:category_id]
end

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

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.

David

Ruby Rails

unread,
May 3, 2007, 6:21:30 PM5/3/07
to rubyonra...@googlegroups.com

@Jason: your solution worked flawlessy :) 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 :)
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
formatted_all_offers_path(:rss)
all_new_offer_url
all_preview_new_offer_url()

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

Am I missing something?

David Richards

unread,
May 3, 2007, 6:33:18 PM5/3/07
to Ruby on Rails: Talk
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.

Reply all
Reply to author
Forward
0 new messages