7

J'ai développé le backend CMS pour un site Web depuis quelques semaines maintenant. L'idée est de tout d'abord créer tout le backend afin qu'il puisse gérer la base de données et les informations qui seront affichées sur le site principal.Création d'un répertoire d'administration dans Rails

A partir de maintenant, j'ai actuellement toute ma configuration de code dans la structure MVC de rails normaux. Donc l'admin des utilisateurs est/users et les videos sont/videos.

Mes plans sont de prendre le code pour cela et le déplacer vers un répertoire/admin. Donc, les deux contrôleurs ci-dessus doivent être accessibles par/admin/users et/admin/videos. Je ne suis pas sûr de savoir comment faire la ruote (en ajoutant le/admin comme préfixe) et je ne suis pas sûr de la façon de gérer la logique. Ce que je pense faire est de mettre en place un contrôleur 'intermédiaire' supplémentaire qui est en quelque sorte imbriqué entre l'ApplicationControler et le contrôleur ciblé lorsque le répertoire/admin est accédé. De cette façon, tous les drapeaux supplémentaires et les méthodes surchargées peuvent être engendrés pour la section/admin seulement (je crois que je pourrais utiliser un filtre aussi pour cela). Si cela devait fonctionner, le problème suivant consisterait à séparer la logique des vues (mais ce serait simplement de renommer les dossiers, etc.). Soit je le fais de cette façon, soit j'ai deux instances de rails qui partagent le code MVC entre eux (et je suppose que la base de données aussi), mais je crains que cela ne cause beaucoup d'erreurs de duplication.

Des idées sur comment je devrais faire cela?

Merci beaucoup!

Répondre

6

Si cela ne vous dérange pas d'avoir deux contrôleurs pour chaque ressource, vous pouvez avoir un espace de noms "admin" séparé. Je l'aime de cette façon, car la section admin est complètement différente de la section publique. Les contrôleurs admin implémentent toutes les actions CRUD, tandis que les publics n'implémentent que les actions show et index.

routes.rb:

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

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

vos contrôleurs pourrait être quelque chose comme:

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 

contrôleurs et points de vue ont espaces de noms leur propre répertoire dans les app/contrôleurs et app/répertoires vues.Si vous utilisez l'assistant form_for, vous devez modifier ses paramètres:

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

Vous pouvez le faire sans un contrôleur supplémentaire, relativement facilement dans 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 } 

Qu'est-ce :requirements ne fait ici, parce que je lui ai donné une constante et non une expression régulière, est juste d'ajouter params[:is_admin] quand on y accède par cette route. Vous pouvez donc vérifier cette valeur dans votre contrôleur et afficher différentes vues, ou vous pouvez simplement vérifier dans la vue si les deux vues sont similaires. Il est important d'inclure l'exigence avec false sur les versions non-administrateur sinon les gens peuvent simplement utiliser /users/?is_admin=true.

Le :name_prefix modifie les noms de route, de sorte que vous avez par exemple. admin_video_path(123) ainsi que video_path(123).

Testé sur Rails 2.3.5, les autres versions peuvent différer. Pour plus d'informations sur les options disponibles sur les routes RESTful, voir le ActionController::Resources docs.

+0

Merci les gars. C'est exactement ce dont j'avais besoin. – matsko

Questions connexes