Контроллер группировки в подкаталогах для вложенных ресурсов
Я хотел бы организовать мои контроллеры в подкаталогах. Вот пример:
routes.rb:
resources :locations do
resources :users
end
Я хотел бы поместить мой контроллер в соответствующий подкаталог:
app/controllers/locations/users_controller.rb
и url будет (стандартным):
/locations/1/users
/locations/1/users/new
/locations/1/users/10/edit
...
Если бы у меня было пространство имен на моих маршрутах, я мог бы изменить my users_controller.rb на
class Locations::UsersController < LocationsController
end
но он не работает с вложенными ресурсами, вместо этого я получаю следующую ошибку:
Routing Error
uninitialized constant UsersController
Update
Он работает, если я добавляю:
resources :locations do
resources :users
end
match 'locations/:location_id/users' => "locations/users#index"
но мне нужно будет добавить маршрут для каждого действия и вложенного ресурса...
Ответы
Ответ 1
Если вы хотите использовать только один маршрут:
match 'locations/:location_id/users' => "locations/users#index"
Это должно появиться перед любыми другими ресурсами/совпадениями, которые могут противоречить этому совпадению. По умолчанию маршруты Rails расположены сверху вниз.
# should be before locations resource
resources :locations do
resources :users
end
В качестве альтернативы, если вы хотите привязать весь свой вложенный ресурс users
к locations/users
, вы можете назначить контроллер ресурсу.
resources :locations do
resources :users, :controller => "locations/users"
end
Ответ 2
Можно использовать модули для вложенных маршрутов с вложенными контроллерами:
resources :locations do
scope module: :locations do
resources :users
end
end
$рейк-маршруты
...
location_users GET /locations/:location_id/users locations/users#index
...
Ответ 3
Как говорит Квон, этот порядок имеет значение. Но вы все равно можете использовать пространство имен.
.../конфиг/routes.rb
namespace :locations do
resources :users
end
resources :locations
.../app/controller/locations_controller.rb:
class LocationController < ApplicationController
.../app/controller/locations/users_controller.rb:
class Locations::UsersController < LocationsController