Допустим, у моего приложения есть две модели: Foo и Bar.
Foo опционально принадлежит Bar.
Прямо сейчас я могу посмотреть на один Foo или найти определенный Foo, и FoosController обрабатывает все это. Мои URL-адреса похожи на:
foos/1
и foos/new
Иногда я хочу посмотреть на бар. BarsController обрабатывает это, и я получаю это как:
bars/1
или bars/1/edit
.
Если я смотрю на Бар, возможно, мне захочется просмотреть все ФУ, которые являются частью этого Бар. Итак, я хотел бы использовать bars/1/foos/
, чтобы посмотреть на эти Foos.
Это довольно просто для вложенных ресурсов и выглядит так:
resources :foo
resources :bar do
resources :foo
end
Однако, Foos, которые являются частью бара, являются своего рода особыми, отличными от обычных Foos. Так, например, если я загружу foos/1
или bars/1/foos/1
, я бы посмотрел на тот же Foo, но в каждом случае я сосредоточен на различной информации.
Так что я думал о контроллере BarFoos для обработки Foos, когда они находятся в контексте Bar. Однако, если я вложу BarFoos под Bar, то мои помощники будут похожи на bar_bar_foos_path
и new_bar_bar_foo_path
. Это кажется излишним.
Итак, теперь я думаю о пространствах имен, которые я никогда раньше не изучал. Я вижу в руководстве по рельсам, что я могу определить:
namespace "bar" do
resources :foos
end
Если я сделаю это, я могу сделать секунду FoosController
под app/bar/
, и этот FoosController сможет обрабатывать Foos внутри бара с хорошими помощниками, такими как bar_foo_path(:id)
вместо bar_bar_foo_path(:id)
.
Но если я сделаю это, что случится с моим BarsController
? Как запросы перенаправляются на BarsController
, если вместо resources :bars
у меня есть namespace "bar"
?
И, наконец, есть ли что-то особенное, что мне нужно сделать внутри моего вторичного FoosController, чтобы убедиться, что нет конфликта имен с FoosController верхнего уровня? Я понимаю, что в маршрутизации указано «пространство имен», но как остальная часть кода ruby узнает, что app/bar/foos_controller
и app/foos_controller
не принадлежат к одному и тому же классу?
Спасибо!