2009-09-06 23 views
7

Estoy usando HAML para generar algunas páginas html estáticas para un sitio, y quería dividir los componentes comunes en parciales que puedo incluir en varias páginas, al igual que en Rails . Sin embargo, no quiero usar toda la pila de Rails para hacer esto, ya que parece excesivo.Rendering Partials HAML desde dentro de HAML fuera de Rails

He mirado alrededor en el Internet, pero no he encontrado nada, mejor que simplemente hacer algo como:

Haml::Engine.new(IO.read("header.haml")).render 

¿Hay una manera más agradable de incluir los llamados parciales desde dentro HAML? ¿Un filtro o comando existente que me falta?

Respuesta

6

Lo mejor es combinar haml & sass con una herramienta para construir sitios web estáticos. He aquí algunos enlaces:

estoy usando Jekyll para mi blog, pero si no está la construcción de un blog probablemente no es apropiado para sus necesidades.

+0

Aunque Jekyll se ve bien , está hecho para blogs. Aunque StaticMatic parece ser justo lo que quiero. Estaba pensando en implementar algo similar (es decir, usar Erb como pre/post-procesador para plantillas Haml, como C compiladores worl). Gracias – Daemin

3

Darn, tienes razón, no hay una forma incorporada. He utilizado ayudantes con la línea de comandos haml, pero siempre aquellos cuya salida ya tenía formato HTML.

Mi mejor sugerencia es escribir un método partial() y requerirlo. Parece que ya has comenzado por este camino. Sugeriría que cualquiera que escriba tal función considere mantener el enlace original de alguna manera. Haml::Helpers#capture_hame parece ser la forma más fácil de hacer que esto suceda.

Si la velocidad de ejecución es un problema, también podría ser una buena idea almacenar en caché parte de la plantilla analizada de la misma forma que lo hace Merb.

Si alguien obtiene algún código funcionando, por favor colóquelo en GitHub y haga un comentario aquí.

0

Todas las soluciones parecían voluminosas para mis propósitos, aunque estoy tratando de hacer básicamente lo mismo. Aquí hay un script de ruby ​​que escribí que hace muy poco: evalúa a Haml con la opción de quedarse en el = partial "test.haml" donde quieras. Hace una cantidad trivial de lógica para tratar de encontrar un archivo parcial.

require 'haml' 

def find filename 
    return filename if File.exists? filename 
    path = File.dirname ARGV[0] 
    filename = path+"/"+filename 
    return filename if File.exists? filename 
    throw "Could not find file." 
end 

def partial filename 
    source = File.read(find(filename)) 
    engine = Haml::Engine.new(source) 
    engine.render(binding) 
end 

puts partial ARGV[0] 

que ejecutarlo así: rubí hamlize.rb input.haml> output.html

0

que tenía el mismo problema. Necesitaba generar algunos fragmentos de html para optimizar la respuesta del servidor, una vez que estos fragmentos tienen muchos cálculos (para dibujar gráficos) y cada vez que un usuario hace una solicitud está haciendo todas las cosas innecesariamente.

Una vez que tengo las vistas divididas en varios parciales haml, quería reutilizar esto para generar los archivos html.

Mi primer enfoque fue probar con el motor Haml, pero una vez que tengo parciales que representan otros parciales y algunas funciones de la aplicación auxiliar, no funcionó. Finalidad he encontrado una solución que pasa por la creación de una función en los modelos que quería crear un archivo html (to_html) Aquí es:

def to_html 
    ActionView::Base.send :include, ActionView::Helpers::ApplicationHelper 

    File.open(File.join(Rails.root, "public", 'test.html'), "w") do |file| 

    file.print ActionView::Base.new(Rails.configuration.paths["app/views"].first).render(
       :partial => 'partial_folder/partial', 
       :format => :html, 
       :locals => { :model => self} 
      ) 
    end 
end 

De esta manera, yo era capaz de utilizar los parciales ya se ha realizado, para imprimir los archivos html. Esto funcionó para mí, tal vez también pueda ayudarte.

0

Finalmente encontré lo que estaba buscando, así que pensé en compartir mi hallazgo con usted. puede simplemente usar la misma sintaxis que se utiliza para haml en el primer lugar - http://www.semicomplete.com/blog/geekery/partials-in-haml-in-sinatra.html

/views/file.haml

%h3 Title 
%div= haml :content, :layout => false 

/views/content.haml

%p your content here 
+0

Me acabo de dar cuenta de que si quieres pasar a tus locales, debes agregar ": locals => locals" a la declaración "haml: content" – AxelTheGerman