Forum: Ruby on Rails RESTful Routing: Getting names of resources out of paths

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.
710eb9516d466362bc80a2f8d3c31cab?d=identicon&s=25 Chris Hanks (preciousbodilyfluids)
on 2009-04-18 20:11
Hello -

I'm trying to remain RESTful in a new application that I'm building, but
I'm not sure how to get the routes that I want. I'm trying to avoid
having resource names like "posts" and "comments" cluttering things up.

For example, for a resource that I designate:

GET example.com -> index
GET example.com/1 -> show, id=1
GET example.com/1/edit -> edit, id=1
GET example.com/new -> new

Etc. In addition, I'd like to nest another resource beneath that
(there's a has_many relationship), so that I can get routes like:

example.com/1/3
example.com/1/3/edit

Etc. I'm planning on using friendly_id to change the IDs and make the
URLs more memorable, but before I introduce that I just want to get
those resource names out of there. I want to remain as restful as
possible, but I'm not sure how to get this using map.resources.

Ideas?

Thanks,
Chris
782b01570270ab10543bc25a258d7ea8?d=identicon&s=25 Dmitry Sokurenko (Guest)
on 2009-04-21 16:00
(Received via mailing list)
Hi Chris,

You can't do it using Rails' map.resources macro. You need to use the
router directly, like this:

map.posts '', :controller => 'posts', :action => 'index', :conditions
=> {:method => :get}
map.posts '', :controller => 'posts', :action => 'create', :conditions
=> {:method => :post}
map.new_post 'new', :controller => 'posts', :action =>
'new', :conditions => {:method => :get}
map.post ':id', :controller => 'posts', :action => 'show', :conditions
=> {:method => :get}
map.post ':id', :controller => 'posts', :action =>
'update', :conditions => {:method => :put}
map.post ':id', :controller => 'posts', :action =>
'destroy', :conditions => {:method => :delete}
map.edit_post ':id/edit', :controller => 'posts', :action =>
'edit', :conditions => {:method => :get}
map.resources :comments, :path_prefix => ':post_id'

it will work, but generally it's not a very good idea to have such
URLs, cause it won't work very well if you will have lots of resources
at some point. Maybe it will be better to use standard routes + 2
aliases, for index (/ — shows all posts) and for show (/123 - shows a
specific post).

Dmitry
This topic is locked and can not be replied to.