Скажем, мое приложение имеет две модели: 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 не являются одним и тем же классом?
Спасибо!