Маршрут Rails 3 добавляет _index к названию маршрута
Я переношу версию Rails 2.3.8 в Rails 3.0 и поэтому перезаписал файл маршрутов. Когда я перечисляю маршруты с помощью rake routes
, я вижу, что к некоторым именам маршрутов добавлен _index
. Я не могу понять, почему это так.
Соответствующие маршруты:
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
Выход из rake routes
Рельсы 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)
POST /planner/unsubscribe(.:format)
Любые идеи относительно того, почему этот _index
добавляется, будут очень оценены.
Ответы
Ответ 1
Это связано с тем, что ваш ресурс называется :planner
вместо :planners
, который Rails решил добавить _index в любую вложенную под ним коллекцию. Я предполагаю, что он доступен для читаемости.
Действие, названное в коллекции, обычно переводит на глагол, поэтому я могу понять, почему это имеет смысл. Возьмите пример типичного примера фотографий, указанный в документах маршрутизации:
resources :photos do
collection do
get 'search'
end
end
search_photos GET /photos/search(.:format)
Но если вместо этого мы назвали ресурс "фото"...
resources :photo do
collection do
get 'search'
end
end
search_photo_index GET /photo/search(.:format)
В первом случае вы просматриваете "фотографии", а во втором случае вы ищете "индекс фотографии".
Ответ 2
Вы должны использовать либо resource :planner
либо resources :planners
в зависимости от того, что вам нужно. Чтобы узнать о уникальном ресурсе и его отличиях, просмотрите Rails Guides.
Ответ 3
Следуя ответу Semyon Perepelitsa, обратите внимание, что resource :planner
ожидает, что имя контроллера PlannersController
, тогда как resources :planners
ожидает PlannerController
.
Если вы не хотите переименовывать свой контроллер при переходе с ресурсов на ресурс, вы можете переопределить значение по умолчанию, указав resource :planner, controller: :planner
.