7

He estado desarrollando el backend de CMS para un sitio web durante algunas semanas. La idea es crear todo en el backend primero para que pueda administrar la base de datos y la información que se mostrará en el sitio web principal.Crear un directorio de administración en Rails

Por el momento, actualmente tengo todo mi código configurado en la estructura MVC de rieles normales. Entonces, el administrador de los usuarios es/users y videos is/videos.

Mis planes son tomar el código para esto y moverlo a un directorio/admin. Entonces/admin/users y/admin/videos necesitarían acceder a los dos controladores anteriores. No estoy seguro de cómo hacer todo el ruote (agregando el/admin como prefijo) ni estoy seguro de cómo administrar la lógica. Lo que estoy pensando hacer es configurar un controlador "medio" adicional que de alguna manera se anida entre ApplicationControler y el controlador objetivo cuando se accede al directorio/admin. De esta forma, se pueden generar indicadores adicionales y métodos sobrecargados solo para la sección/admin (creo que también podría usar un filtro para esto).

Si eso fuera a funcionar, entonces el siguiente problema sería separar la lógica de las vistas (pero eso simplemente sería cambiar el nombre de las carpetas, etc.).

O lo hago de esa forma o tengo dos instancias de rieles que comparten el código MVC entre ellos (y supongo que también la base de datos), pero me temo que eso causaría muchos errores de duplicación.

¿Alguna idea sobre cómo debo hacer esto?

¡Muchas gracias!

Respuesta

6

Si no te importa tener dos controladores para cada recurso, podrías tener un espacio de nombres "admin" por separado. Me gusta de esta manera, ya que la sección de administración es completamente diferente de la pública. Los controladores de administración implementan todas las acciones de CRUD, mientras que los públicos implementan solo acciones de mostrar e indexar.

routes.rb:

map.namespace :admin do |admin| 
    admin.resources :users 
    admin.resources :videos 
end 

map.resources :videos, :only => [:index, :show] 

Sus controladores podría ser algo como:

class VideosController < PublicController; end 

class Admin::VideosController < Admin::AdminController; end 

class PublicController < ApplicationController 
    layout 'public' 
    before_filter :load_public_menu 
end 

class Admin::AdminController < ApplicationController 
    layout 'admin' 
    before_filter :login_required, :load_admin_menu 
end 

controladores de espacios de nombres y puntos de vista tienen su propio subdirectorio dentro de la aplicación/controladores y app/views directorios.Si utiliza el ayudante form_for, tiene que modificar sus parámetros:

form_for [:admin, @video] do |f| 
1

Puede hacer esto sin un controlador adicional, con relativa facilidad en config/routes.rb:

# non-admin routes 
# your args could include :only => [:index,:show] for the non-admin routes 
# if you wanted these to be read-only 
map.resources :users, ...your args..., :requirements => { :is_admin => false } 
map.resources :videos, ...your args..., :requirements => { :is_admin => false } 
# admin routes 
map.resources :users, ...your args..., :path_prefix => '/admin', \ 
    :name_prefix => 'admin_', :requirements => { :is_admin => true } 
map.resources :videos, ...your args..., :path_prefix => '/admin', \ 
    :name_prefix => 'admin_', :requirements => { :is_admin => true } 

Lo :requirements realmente hace aquí, porque me dio una constante y no una expresión regular, es sólo para añadir params[:is_admin] cuando se accede a través de esta ruta De modo que puede verificar este valor en su controlador y representar diferentes vistas, o puede simplemente verificarlo en la vista si las dos vistas son similares. Es importante incluir el requisito con false en las versiones que no son de administrador; de lo contrario, la gente solo puede usar /users/?is_admin=true.

El :name_prefix edita los nombres de ruta, por lo que tiene, por ejemplo, admin_video_path(123), así como video_path(123).

probado en Rails 2.3.5, otras versiones pueden diferir. Para obtener más información sobre las opciones disponibles en rutas RESTful, consulte el ActionController::Resources docs.

+0

Gracias chicos. Esto es exactamente lo que necesitaba. – matsko

Cuestiones relacionadas