2010-11-19 26 views
31

He creado varios controladores & vistas en un espacio de nombres 'admin', pero todavía están tirando del diseño de la aplicación. ¿cómo puedo hacer un diseño que se aplique a todas las vistas en las rutas de espacio de nombres, y todavía usar el diseño actual para las otras páginas?rails 3: diseño para rutas con espacios de nombres

Respuesta

36

En términos generales, los carriles utilizará el diseño de la aplicación, si no hay un diseño que coincide con el controlador. Por ejemplo, si tiene un PeopleController, Rails buscará layouts/people.html.erb y, si no lo encuentra, application.html.erb.

Puede especificar explícitamente un diseño específico si desea anular esta convención.

class Admin::PeopleController 
    layout 'some_layout' 
end 

Ese controlador entonces utilizar some_layout.html.erb en lugar de buscar people.html.erb y application.html.erb.

Pero esto podría ser una mejor manera si usted está mirando para agrupar cosas: Si usted tiene una base de AdminController que hereda de ApplicationController, usted puede tener su, digamos, de administración :: PersonController heredan de la AdminController y heredará el diseño de administrador.

No sé los detalles de su código, pero es posible que tenga:

class AdminController 
    def show 
    #render a template linking to all the admin stuff 
    end 
end 

app/controllers/admin/people_controller.rb: 
class Admin::PeopleController < AdminController 
    #your awesome restful actions in here! 
end 

views/layouts/admin.html.erb: 
Hello from the Admin! 
<%= yield %> 

Lo único que sabe es que administración :: PeopleController heredará cualquier acción que AdminController ha definido (al igual que cualquier cosa definido en ApplicationController está disponible en todas las subclases). Esto generalmente no es un problema, ya que probablemente sobrescriba los métodos de todos modos, pero solo para estar al tanto. Si no tiene un AdminController, puede crear uno sin acciones solo para el diseño.

+2

La 'clase AdminController' está bajo' app/controllers' o 'app/controllers/admin'? – jdscosta91

+0

en 'app/controllers' – Damien

+0

Estoy intentando esto, y parece funcionar, pero pierdo los estilos y la funcionalidad que ofrecen los frameworks como Bootstrap o Semantic-UI. Alguna idea de como resolver esto? – Sebastialonso

40

Normalmente tengo una clase de controlador Base en mi espacio de nombres, y luego todos los controladores en ese espacio de nombres heredan de ella. Eso me permite poner código específico de espacio de nombres común en Base y todos los controladores en ese espacio de nombres pueden aprovecharlo. Por ejemplo:

class Admin::BaseController < ApplicationController 
    layout 'admin' 
    before_filter :require_admin_user 
end 

class Admin::WidgetsController < Admin::BaseController 
    # inherits the 'admin' layout and requires an admin user 
end 
+2

Creo que esto es más elegante y estructurado que la respuesta aceptada. ¿Hay alguna manera de hacer que todos los controladores generados por el comando 'rails g' hereden de' Admin :: BaseController'? – berezovskyi

+0

¿dónde debería ir este controlador de base? – Sebastialonso

+3

La clase del controlador es Admin :: BaseController, por lo que Rails asume que se definirá en el archivo base_controller.rb en la carpeta de controladores/admin. – IAmNaN

Cuestiones relacionadas