Częściowy szablon HAML w Ruby bez Rails
Naprawdę nie potrzebuję napowietrznych szyn do mojego bardzo małego projektu, więc staram się to osiągnąć za pomocą zwykłego Ruby i HAML.
Chcę dołączyć inny plik HAML do mojego szablonu HAML. Ale nie znalazłem dobrego - lub naprawdę użytecznego-sposobu na zrobienie tego.
Na przykład mam te dwa pliki HAML:
Dokumenty.haml
%html
%body
= include(menu.haml) body
%article …
Menu.haml
%ul
%li
%a whatever …
Include to oczywiście nie jest sposób, aby przejść tutaj. Ale to ładnie opisuje to, czym jestem próbuje osiągnąć w tym przykładzie.
5 answers
Robiłem to już wcześniej, tylko dla szybkiego i brudnego producenta szablonów. Najprostszym sposobem jest renderowanie HAML wewnątrz obiektu nadrzędnego:
%p some haml that's interesting
= Haml::Engine.new('%p this is a test').render
%p some more template
Prawdopodobnie będziesz chciał zbudować kilka metod, aby to ułatwić--kilka metod pomocniczych. Może napiszesz plik o nazwie render_file, który przyjmuje nazwę pliku jako argument. Ta metoda może wyglądać mniej więcej tak:
def render_file(filename)
contents = File.read(filename)
Haml::Engine.new(contents).render
end
Wtedy Twój szablon wyglądałby bardziej jak:
%p some template
= render_file('some_filename.haml')
%p more template
Uwaga, prawdopodobnie będziesz musiał zdać self do oryginalnego renderowania Haml:: Engine, aby wiedział jak znaleźć metodę render_file.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-25 19:06:28
Całkowicie polecamTilt perełkę do tych rzeczy. Zapewnia standardowy interfejs do renderowania wielu różnych języków szablonów z tym samym API, pozwala ustawić niestandardowy zakres i lokalne, pozwala używać yield i jest solidny i szybki. Sinatra używa go do tworzenia szablonów.
Przykład:
require 'haml'
require 'tilt'
template = Tilt.new('path/to/file.haml')
# => #<Tilt::HAMLTemplate @file="path/to/file.haml" ...>
layout = Tilt.new('path/to/layout.haml')
output = layout.render { template.render }
To pozwala yield
wewnątrz układu uzyskać renderowany szablon, tak jak Rails. Jeśli chodzi o częściowe, David już opisał prosty i przyjemny sposób.
Ale właściwie, jeśli to, co piszesz, ma być serwowane przez HTTP, proponuję rzucić okiem na Sinatra , który już dostarcza szablony i ma najprostszy routing żądań, jaki możesz sobie wyobrazić.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-08 09:10:34
Odniosłem wielki sukces po prostu używając instrukcji zamieszczonych przez Davida Richardsa w konkatenowany sposób, bez zmiennych, jak to:
= Haml::Engine.new(File.read('/Volumes/Project/file_to_include.haml')).render
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:32:39
def render_file(filename)
contents = File.read('views/'+filename)
Haml::Engine.new(contents).render
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-29 11:09:13
(dodanie tej pół-redundantnej odpowiedzi, aby pokazać, w jaki sposób można włączyć techniki z innych odpowiedzi.)
Umieść coś takiego w swoim kodzie instalacyjnym, aby naprawić bibliotekę Haml.
module Haml::Helpers
def render_haml(filename)
contents = File.read(Rails.root.join("app", "assets", "templates", filename))
Haml::Engine.new(contents).render
end
end
Następnie w pliku Haml
.foo
= render_haml('partial.haml')
.bar
Oczywiście jest to przykład rails-owski (ponieważ chciałem użyć HAML w moim potoku zasobów zamiast jako widoków)... Będziesz chciał zastąpić Rails.root.join(...)
sposobem znalezienia filename
w katalogu szablonów lub stron projektu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-26 14:02:50