开发者

Rails 3 route appends _index to route name

开发者 https://www.devze.com 2023-03-15 13:53 出处:网络
I am migrating a Rails 2.3.8 version to Rails 3.0 and so ive rewritten my routes file. When i list the routes using rake routes, i see some route names have _index appended to them. I cant figure out

I am migrating a Rails 2.3.8 version to Rails 3.0 and so ive rewritten my routes file. When i list the routes using rake routes, i see some route names have _index appended to them. I cant figure out why this is.

Relevant routes:

Rails 2.3.8:

map.namespace "tracker", :path_prefix => "" do |planner|
    planner.resources :planner, :collection => {:step1 => :get,
                                                :add => :get,
                                                :unsubscribe => [:get, :post] }
end

Rails 3.0 route:

namespace "tracker", :path => "" do
  resources :planner do
    collection do
      get :step1
      get :add
      get :unsubscribe
      post :unsubscribe
    end
  end
end

Output from rake routes

Rails 2.3.8

step1_tracker_planner        GET    /planner/step1(.:format)
add_tracker_planner          GET    /planner/add(.:format)
unsubscribe_tracker_planner  GET    /planner/unsubscribe(.:format)
                             POST   /planner/unsubscribe(.:format) 

Rails 3.0

step1_tracker_planner_index       GET    /planner/step1(.:format)
add_tracker_planner_index         GET    /planner/add(.:format)
unsubscribe_tracker_planner_index GET    /planner/unsubscribe(.:format)
                                开发者_StackOverflow社区  POST   /planner/unsubscribe(.:format) 

Any ideas as to why this _index is being added would be much appreciated.


It is because your resource is named :planner instead of :planners that Rails decided to add the _index to any collection nested underneath. My guess it is there for readability.

The action named in the collection normally translates to a verb, so I can see why this makes sense. Take the typical photos resource example given in the routing docs:

resources :photos do
  collection do
    get 'search'
  end
end

search_photos GET    /photos/search(.:format)

But if instead we called the resources 'photo'...

resources :photo do
  collection do
    get 'search'
  end
end

search_photo_index GET    /photo/search(.:format)

In the first case, you search the "photos", and in the second case you search the "photo index".


You should be using either resource :planner either resources :planners depending on what you need. To learn about singular resource and it differences check out Rails Guides.


Following on from Semyon Perepelitsa's response, note that resource :planner expects the controller's name is PlannersController, whereas resources :planners expects PlannerController.

If you don't want to rename your controller when changing from resources to resource, you can override the default by specifying resource :planner, controller: :planner.

0

精彩评论

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

关注公众号