Фиктивное приложение для направляющих имеет следующие ресурсы:
Photographers
Images
Comments
A Photographer
имеет многих Images
, это имеет многих Comments
Каждый фотограф имеет вход в систему и может просмотреть, загрузить, отредактировать и удалить их изображения, комментарии, а также их собственный профиль.
Интерфейс администрирования доступен и может отредактировать и изображения, фотографов и комментарии.
Кроме того, фотограф, их изображения и их комментарии доступны от открытого интерфейса без входа в систему, где посетители могут добавить комментарии.
Мой вопрос: Что путь направляющих структурировать контроллеры? Я думал о движении с пространствами имен для каждой 'роли' (общественность, учетная запись, администратор) как это:
# For administrator
Admin::PhotographersController
Admin::ImagesController
Admin::CommentsController
# For a logged in photographer
AccountController (?)
Account::ImagesController
Account::CommentsController
# For public
PhotographersController
ImagesController
CommentsController
Однако - некоторые методы этих контроллеров накладываются. Действительно ли это - лучший способ, даже при том, что это не тот DRY?
Спасибо!
Если они пересекаются, вы можете расширить базовые контроллеры в пространства имен учетной записи/админа. Например, вы делаете свой ImagesController, который предназначен для действий, которые могут видеть все. Он расширяет ApplicationController, как обычно. Затем вы делаете свою администраторскую версию ImageController, и она расширяет ImagesController. Затем вы добавляете/переопределяете методы в версии для администратора для требуемого различного поведения, или это может быть просто добавление пары фильтров before, таких как require_admin, например, который проверяет, что текущий_пользователь является пользователем-администратором, и перенаправляет его, если нет.
как вы сказали, это не совсем DRY. по крайней мере, вы могли бы структурировать маршруты и контроллеры для выполнения всех требований, например:
resources :photos, :only => [:index, :show] # offer only index and show actions to public
scope "/admin" do
resources :photos # full access for logged in users
end
если вам также нужны действия index и show, вы можете добавить некоторые проверки внутри них для загрузки другого представления (скажем, у вас есть публичный и администраторский макеты).
Другим способом может быть уникальный макет, без разделов /admin/ и с возможностью редактирования для зарегистрированных пользователей. так что если вы зарегистрированы и являетесь владельцем какой-то фотографии, разрешите редактирование и покажите контекстные ссылки. это дело вкуса :P
.