2010-07-06 2 views
5

приложение фиктивный Rails имеет следующие ресурсы:Rails-способ структурирования администратора/пользователи/общественные контролеры

Photographers 
Images 
Comments 

Photographer имеет много Images, что есть много Comments

Каждый фотограф имеет логин и позволяет просматривать, загружать, редактировать и удалять свои изображения, комментарии, а также их собственный профиль.

Доступен интерфейс администрирования и может редактировать изображения, фотографы и комментарии.

Кроме того, фотограф, их изображения и комментарии доступны из открытого интерфейса без регистрации, где посетители могут добавлять комментарии.

Мой вопрос: что такое Rails-способ структурирования контроллеров? Я думал идти с пространствами имен для каждой «роли» (общественный, счет, администратора), как это:

# For administrator 
Admin::PhotographersController 
Admin::ImagesController 
Admin::CommentsController 

# For a logged in photographer 
AccountController (?) 
Account::ImagesController 
Account::CommentsController 

# For public 
PhotographersController 
ImagesController 
CommentsController 

Однако - некоторые из методов этих контроллеров накладываются друг на друга. Это лучший способ, хотя это не так сухо?

Спасибо!

ответ

3

Если они перекрываются, вы можете расширить базовые контроллеры в пространства имен account/admin. например, вы делаете свой ImagesController, который предназначен для действий, которые каждый может видеть. Это расширяет ApplicationController как обычно. Затем вы делаете свою административную версию ImageController и расширяете ImagesController. Затем вы добавляете/переопределяете методы в версии администратора для требуемого различного поведения, или это может быть просто как добавление пары перед фильтрами, таких как require_admin, например, которая проверяет, что current_user является пользователем admin, и перенаправляет их, если не.

2

как вы сказали, на самом деле это не СУХОЙ. по крайней мере, можно структурировать маршруты и контроллеры действовать для всех требований, например:

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 

, если вам также необходимо индексировать и показать действия, вы можете добавить некоторые проверки внутри них, чтобы загрузить другой вид (скажем, вам имеют общедоступные и административные макеты).

Другой способ может состоять в том, чтобы иметь уникальный макет, нет/admin/разделы и предлагать функции редактирования для зарегистрированных пользователей. поэтому, если вы зарегистрировались и владеете некоторой фотографией, разрешите редактировать и показывать контекстные ссылки. это вопрос вкусов: P

Смежные вопросы