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.

Author: Aeyoun, 2011-03-25

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.

 18
Author: David Richards,
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ć.

 23
Author: Jostein,
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

Jest oczywiście bardziej elegancki sposób. Ale dla kogoś, kto chce tylko dołączyć jeden lub dwa pliki, powinno to działać ładnie. Wadą jest to, że wszystkie pliki bazowe korzystające z tych elementów muszą zostać przekompilowane po pewnych zmianach w tym drugim. Warto byłoby po prostu użyć PHP include, jeśli środowisko na to pozwala.
 3
Author: Sascha Michael Trinkaus,
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
 0
Author: McNally Paulo,
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.

 -1
Author: mlibby,
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