Для организации наших приложений я сделал всего понемногу в зависимости от ситуации.
Во-первых, что касается отдельных контроллеров для функций администратора / пользователя, я скажу, что вы, вероятно, не хотите идти по этому пути. Мы использовали авторизацию и before_filter
для управления правами в приложении. Мы катились самостоятельно, но 20/20 задним ходом, мы должны были использовать CanCan . Оттуда вы можете настроить что-то вроде этого (это псевдокод, реальный язык будет зависеть от того, как вы реализовали авторизацию):
before_filter :can_edit_user, :only => [:new, :create, :edit, :update] #or :except => [:index, :show]
protected
def can_edit_user
redirect_to never_never_land_path unless current_user.has_rights?('edit_user')
end
Или на более высоком уровне
before_filter :require_admin, :only [:new, :create]
и в вашем контроллере приложения
def require_admin
redirect_to never_never_land_path unless current_user.administrator?
end
Это зависит от того, какой маршрут, но я бы использовал его для авторизации вместо разделения контроллеров.
Что касается пространств имен и вложенных ресурсов, то это зависит от ситуации. В нескольких наших приложениях у нас есть оба. Мы используем пространства имен, когда есть причина для логического разделения или будут общие функции между группой контроллеров. Для нас важно и то, что мы помещаем административные функции в пространство имен, а внутри у нас есть пользователи, роли и другие собственные функции администратора.
map.namespace :admin do |admin|
admin.resources :users
admin.resources :roles
end
и затем внутри этих контроллеров у нас есть базовый контроллер, который хранит наши общие функции.
class Admin::Base < ApplicationController
before_filter :require_admin
end
class Admin::UsersController < Admin::Base
def new
....
end
Это обеспечивает нам логическое разделение данных и возможность немного подсушивать наш код, обмениваясь такими вещами, как before_filter
.
Мы используем вложенные контроллеры, если будет раздел кода, в котором вы хотите, чтобы между контроллерами сохранялись некоторые вещи. Дело из нашего приложения наших клиентов. Мы ищем и загружаем клиента, а затем у него есть заказы, билеты, места. В этой области у нас загружен клиент, пока мы смотрим на разные вкладки.
map.resources :customers do |customer|
customer.resources :tickets
customer.resources :orders
customer.resources :locations
end
и это дает нам URL:
customers/:id
customers/:customer_id/orders/:id
customers/:customer_id/tickets/:id
Другие преимущества, которые мы получили от этого, - это простота настройки систем меню и вкладок. Эти структуры хорошо подходят для организованного сайта.
Надеюсь, это поможет!