2010-12-07 29 views
7

Básicamente lo que quiero hacer es tener un application.haml raíz que contiene el núcleo y css js entonces el diseño del sitio es algo comoHAML y anidadas Presentaciones

  • application.haml
    • marketing.haml (s) con su propio CSS de marcas y
    • userbackend.haml (s) con su propio CSS de marcas y
    • siteadministrators.haml (s) con su propio CSS de marcas y

así que he intentado hacer esto mediante la adición de un sub_layout a mis controladores de modo, por ejemplo, mi controlador de casa, que está a secciones de marketing obtiene:

controladores
def sub_layout 
    "marketing" 
    end 

para la aplicación podía comprender que los usuarios utilizan

def sub_layout 
    "userapplication" 
end 

def sub_layout 
    "siteadministrators" 
end 

luego en la application.haml llamo = render (: parital => "layouts/# {} controller.sub_layout")

esto devuelve "método no definido` formatos para nada: NilClass"

Al igual que muchos de aquí soy muy nuevo a los rieles y haml especialmente pesar de que tienen experiencia con .NET MVC y el motor de chispa Ver

alguna idea sobre cómo es este haml?

Respuesta

15

Como sospechabas, hay una manera estándar y mucho, mucho mejor de hacerlo. Su application.haml:

!!! XML 
!!! 
%html 
    %head 
    %title Title 
    = stylesheet_link_tag 'global' 
    = yield :styles 
    %body 
    #content 
     = yield 
    = yield :scripts 

Y entonces su marketing.haml:

- content_for :styles do 
    = stylesheet_link_tag 'marketing' 

- content_for :scripts do 
    = javascript_include_tag 'marketing' 

%h1 It's Marketing time! 

Cualquier cosa en el 'content_for: estilos' bloque es ejecutado en el contexto de su respectivo rendimiento en el diseño. No necesita tener un content_for para cada rendimiento; si tiene varios, los resultados se concatenan.

¡Disfrútalo!

+0

Tengo una pregunta de seguimiento, ¿cómo la uso en contexto con los diseños?Entonces, la aplicación-> Vegetales-> Crear aplicación de verduras-> Vegetales-> Editar vegetal debería obtener el archivo 'vegetable.css' – maehue

+0

No estoy muy seguro de lo que quiere decir. En mi ejemplo application.haml es el diseño. Por cierto, en los rieles deberías nombrarlos application.html.haml, marketing.html.haml, etc. – gunn

+0

Lo siento, no esperaba que respondieras tan rápido, edité mi seguimiento – maehue

2

Prueba esto:

= render :file => "layouts/#{controller.sub_layout}" 

llamar a un método en el controlador es problemático, ya que puede exponer su método como una acción. Dado que sólo estás devolviendo una cadena, se puede hacer esto (por ejemplo):

class HomesController < ApplicationController 
    @@sub_layout = "marketing" 
    cattr_reader :sub_layout 

Una mejor opción es, probablemente, para abstraer esto en un método de ayuda donde se puede buscar el valor de la clase del controlador y devolver el diseño nombre del archivo. Eso mantendría los controladores más limpios.

+0

Esto funciona sin embargo sus comentarios de "mejor opción" me hacen pensar que tengo que volver a pensar cómo lo estoy haciendo - algo sorprendido con todos los valores predeterminados en ROR no hay una manera clara de hacerlo ya que parece realmente obvio para mí – maehue