You're right, you can't do it with the nice little resource helpers.
But you can do it yourself with matching. I had this same issue with
a CMS proto-slice I was working on. Here's how I solved it, pretty
much:
Merb::Router.prepare do
identify(Content => :id) do
match("/(:id)").to(:controller => "contents") do
match("(/)contents").to(:action => "index").name(:contents)
match("/edit").to(:action => "edit").name(:edit_content)
match("(/)new").to(:action => "new").name(:new_content)
match("/delete").to(:action => "delete").name(:delete_content)
match(:method => :put).to(:action => "update").name(:update_content)
match(:method => :delete).to(:action => "destroy").name(:destroy_content)
match(:method => :post).to(:action => "create").name(:create_content)
match(:method => :get).to(:action => "show").name(:content)
end
end
end
That "contents" special URL is due to my functional requirement that
the / root would show a homepage (with an ID being set implicitly in
the controller code), not the index of all pages. That's also why the
(:id) is optional. If you wanted / to be the index you could
rearrange some of this. Oh, and the need for the optional (/) in
front of 'new' but not the other methods appears to be some sort of
edge case quirk. It took me way too long to figure out how to make
that work.
Point is, it's still a RESTful resource. I had to write the paths
myself, but it all works the way Merb resources are supposed to.
--
Have Fun,
Steve Eley (sfe...@gmail.com)
ESCAPE POD - The Science Fiction Podcast Magazine
http://www.escapepod.org