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!

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top