Creazione di una directory Admin in Rails
-
23-10-2019 - |
Domanda
ho sviluppato il backend CMS per un sito web per alcune settimane. L'idea è di tutto artigianale nel backend prima in modo che possa gestire il database e le informazioni che verranno visualizzate sul sito principale.
A partire da ora, mi hanno attualmente tutti i setup mio codice nel binari normali MVC struttura. Così l'amministratore utenti è / utenti e video è / video.
I miei piani sono di prendere il codice per questo e spostarlo in una directory / admin. Così i due controller sopra avrebbe bisogno di essere accessibile da / admin / utenti e / admin / video. Io non sono sicuro di come il todo ruote (aggiungendo l'admin / come un prefisso) né sono sicuro su come gestire la logica. Quello che sto pensando di fare è la creazione di un controller aggiuntivo 'mezzo' che in qualche modo viene nidificato tra l'ApplicationControler e il controller mirato quando la directory / admin si accede. In questo modo, eventuali bandiere aggiuntivi e metodi di overload può essere generato solo per la sezione / admin (credo che potrei usare un filtro troppo per questo).
Se così fosse al lavoro, allora il problema successivo sarebbe che separa la vista logica (ma che sarebbe solo la ridenominazione di cartelle e così via).
O io farlo in quel modo o ho due istanze rotaie che condividono il codice MVC tra di loro (e immagino che la base di dati troppo), ma temo che potrebbe causare un sacco di errori di duplicazione.
Tutte le idee su come dovrei andare a fare questo?
Molte grazie!
Soluzione
Se non ti dispiace avere due controller per ogni risorsa, si potrebbe avere uno spazio dei nomi separata "admin". Mi piace in questo modo, dal momento che la sezione amministrativa è completamente diversa da quella pubblica. controllori Admin atto tutte le azioni CRUD, mentre quelli pubblici implementano solo spettacolo e azioni di indice.
routes.rb:
map.namespace :admin do |admin|
admin.resources :users
admin.resources :videos
end
map.resources :videos, :only => [:index, :show]
I tuoi controller potrebbe essere qualcosa del tipo:
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
controllori namespace e punti di vista hanno la loro propria subdirectory all'interno della app / controllori e app / views directory. Se si utilizza l'helper form_for
, è necessario modificare i suoi parametri:
form_for [:admin, @video] do |f|
Altri suggerimenti
E 'possibile fare questo senza un controller aggiuntivo, in modo relativamente facile in 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 }
Cosa :requirements
realtà fa qui, perché ho dato un costante e non un'espressione regolare, è solo per aggiungere params[:is_admin]
quando si accede tramite questo percorso. Così si può verificare questo valore nel controller, e rendere diversi punti di vista, o si può semplicemente controllare la vista, se i due punti di vista sono simili. E 'importante includere il requisito con false
sulle versioni non-admin altrimenti la gente può semplicemente utilizzare /users/?is_admin=true
.
Il :name_prefix
edita i nomi di percorso, in modo da avere per esempio admin_video_path(123)
così come video_path(123)
.
Testato su Rails 2.3.5, altre versioni potrebbero differire. Per ulteriori informazioni sulle opzioni disponibili sulle rotte RESTful, vedere la ActionController :: Risorse docs .