Частичный шаблон HAML в Ruby без Rails
Мне действительно не нужны накладные расходы Rails для моего небольшого проекта, поэтому я пытаюсь достичь этого, просто используя простой Ruby и HAML.
Я хочу включить другой HAML файл в свой шаблон HAML. Но я не нашел хороший или действительно полезный способ сделать это.
Например, у меня есть два файла HAML:
documents.haml
%html
%body
= include(menu.haml) body
%article …
menu.haml
%ul
%li
%a whatever …
Include, очевидно, не путь сюда. Но это хорошая работа, описывающая то, что я пытаюсь достичь в этом примере.
Ответы
Ответ 1
Я сделал это раньше, просто для быстрого и грязного производителя шаблонов. Самый простой способ - просто визуализировать HAML внутри родительского объекта:
%p some haml that interesting
= Haml::Engine.new('%p this is a test').render
%p some more template
Вы, скорее всего, захотите создать некоторые методы, чтобы сделать это проще - несколько вспомогательных методов. Возможно, вы пишете один файл render_file, который принимает имя файла в качестве аргумента. Этот метод может выглядеть примерно так:
def render_file(filename)
contents = File.read(filename)
Haml::Engine.new(contents).render
end
Затем ваш шаблон будет больше похож:
%p some template
= render_file('some_filename.haml')
%p more template
Обратите внимание, что вам, вероятно, придется передать self в исходный рендеринг Haml:: Engine, чтобы он знал, как найти ваш метод render_file.
Ответ 2
Я полностью рекомендую Tilt gem для этих вещей. Он предоставляет стандартный интерфейс для рендеринга множества разных шаблонов с одним и тем же API, позволяет настраивать область видимости и локальные ресурсы, позволяет использовать доходность, а также является надежным и быстрым. Sinatra использует его для шаблонов.
Пример:
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 }
Это позволяет вам yield
внутри макета получать визуализированный шаблон, как и Rails. Что касается частичных, Дэвид уже описал простой и приятный способ пойти.
Но на самом деле, если то, что вы пишете, будет передаваться через HTTP, я предлагаю вам взглянуть на Sinatra, который уже предоставляет шаблоны и имеет простейшую маршрутизацию запросов, которую вы могли себе представить.
Ответ 3
У меня был большой успех, просто используя инструкции, представленные Дэвидом Ричардсом в конкатенированном виде без переменных, например:
= Haml::Engine.new(File.read('/Volumes/Project/file_to_include.haml')).render
Там, очевидно, более элегантный способ. Но для тех, кто просто хочет включить один или два файла, это должно работать хорошо. Недостатком является то, что все базовые файлы, использующие их, должны быть перекомпилированы после некоторых изменений в последнем. Возможно, стоит просто использовать php, если это позволяет среда.
Ответ 4
def render_file(filename)
contents = File.read('views/'+filename)
Haml::Engine.new(contents).render
end
Ответ 5
(Добавление этого полу-избыточного ответа, чтобы показать, как можно использовать методы из других ответов.)
Включите что-то вроде этого в свой код установки, чтобы обезопасить библиотеку 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
Затем в вашем файле Haml
.foo
= render_haml('partial.haml')
.bar
Очевидно, это пример Rails-ish (потому что я хотел использовать HAML в конвейере моего ресурса вместо представлений)... Вы захотите заменить Rails.root.join(...)
на способ поиска filename
в ваших шаблонах проектов или частичный каталог.