开发者

Shallow routing in Rails 3

Having a rough time with my routes in my rails 3 app, I want to have shallow routes like this:

/san-francisco/union-square

But my router insists on having them like so:

/cities/san-francisco/neighborhoods/union-square

I've used this for my routes.rb

shallow do
  resources :cities do
    resources :neighborhoods do
      resources :locations
    end
  end
end

But still I have this:

city_neighborhood_locations GET  /cities/:city_id/neighborhoods/:neighborhood_id/locations(.:format)

Shouldn't it look like:

city_neighborhood_locations GET  /:city_id/:neighborhood_id/:id(.:format)

I'm not sure how to fix this, additionally I'm not sure what I'm doing wrong with my links, I want to be able to use the syntax:

link_to ne开发者_如何学运维ighborhood.name, [:city, neighborhood]

but that seems to invert the :id, and :neighborhood_id when the request comes to the controller, any help on this would be really really helpful!


What you're looking for is not typically known as "shallow routing".

Shallow routing, as Rails defines it, would look like this:

city_neighborhoods         GET  /cities/:city_id/neighborhoods
new_city_neighborhood      GET  /cities/:city_id/neighborhoods/new
(create_city_neighborhood) POST /cities/:city_id/neighborhoods
neighborhood               GET  /neighborhoods/:neighborhood_id

Without shallow routing, that last route would be:

city_neighborhood          GET  /cities/:city_id/neighborhoods/:neighborhood_id

Shallow routing lets you nest a resource underneath another resource (neighborhood under city in this case), but gives you absolute/un-nested routes for the nested resource when the nesting isn't necessary.

This makes sense when you're referencing the nested resource with unique identifiers that are not dependent on the ID of the parent resource. In your example, that's not true (there's potentially a "Union Square" outside of San Francisco; there's definitely going to be duplicates like "Chinatown"), so you probably do not want shallow routes for this case.

What you're wanting is positionally-dependent routing, where the type of resource is assumed/fixed depending on where it appears in the URL. (For instance, you couldn't have anything other than a "neighborhood" follow a "city" under the scheme you outlined.)

I don't think the Rails resource(s) commands will support that by default, but you could probably do it with manual match commands. This is off the top of my head:

match ":city_id", :controller => "cities", :action => "show"
match ":city_id/:neighborhood_id", :controller => "neighborhoods", :action => "show"

This is still RESTful/resource-based, it's just not using the standard Rails way of naming routes.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜