Forum: Ruby on Rails Simple problem with Resources Routes

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Ruby R. (Guest)
on 2007-05-04 01:19
(Received via mailing list)
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 C.
Jason R. (Guest)
on 2007-05-04 01:22
(Received via mailing list)
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 R. (Guest)
on 2007-05-04 02:03
(Received via mailing list)
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 R. (Guest)
on 2007-05-04 02:22
(Received via mailing list)
@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 R. (Guest)
on 2007-05-04 02:34
(Received via mailing list)
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.
This topic is locked and can not be replied to.