Скажем, мое приложение имеет две модели: Foo и Bar.
Foo необязательно принадлежит_бар.
Прямо сейчас я могу посмотреть на один 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 Controller обрабатывает 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
не являются одним и тем же классом?
Спасибо!