Подтвердить что ты не робот

Маршрут 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 добавляется, будут очень оценены.

4b9b3361

Ответ 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.