Частичный шаблон HAML в Ruby без Rails - PullRequest
17 голосов
/ 25 марта 2011

Мне действительно не нужны накладные расходы на Rails для моего очень маленького проекта, поэтому я пытаюсь добиться этого, просто используя простой Ruby и HAML.

Я хочу включить другой файл HAML в мой шаблон HAML. Но я не нашел хорошего - или действительно полезного - способа сделать это.

Например, у меня есть два файла HAML:

documents.haml

%html
 %body
  = include(menu.haml) body
  %article …

menu.haml

%ul
 %li
  %a whatever …

Включить, очевидно, не путь сюда. Но он хорошо описывает, чего я пытаюсь достичь в этом примере.

Ответы [ 5 ]

23 голосов
/ 26 марта 2011

Я полностью рекомендую камень Tilt для этих вещей. Он предоставляет стандартный интерфейс для рендеринга множества различных языковых шаблонов с помощью одного и того же API, позволяет устанавливать настраиваемую область действия и локальные параметры, позволяет использовать yield, а также является надежным и быстрым. Синатра использует его для шаблонов.

Пример:

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 , который уже предоставляет шаблоны и имеет самую простую из возможных маршрутизацию запросов.

18 голосов
/ 25 марта 2011

Я делал это раньше, просто для быстрого и грязного производителя шаблонов.Самый простой способ - просто визуализировать HAML внутри родительского объекта:

%p some haml that's 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.

3 голосов
/ 21 апреля 2013

Я добился большого успеха, просто используя инструкции, опубликованные Дэвидом Ричардсом в сцепленном виде, без переменных, например:

= Haml::Engine.new(File.read('/Volumes/Project/file_to_include.haml')).render

Естьочевидно, более элегантный способ.Но для тех, кто просто хочет включить один или два файла, это должно работать хорошо.Недостатком является то, что все базовые файлы, использующие эти включения, должны быть перекомпилированы после некоторых изменений в последнем.Возможно, стоит просто использовать php include, если это позволяет среда.

0 голосов
/ 26 апреля 2014

(добавив этот полуизбыточный ответ, чтобы показать, как можно использовать приемы из других ответов.)

Включите что-то подобное в ваш установочный код, чтобы обезопасить библиотеку 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-иша (потому что я хотел использовать HAML в моем конвейере ресурсов вместо представлений) ... Вы захотите заменитьRails.root.join(...) с возможностью найти filename в каталоге шаблонов или директорий вашего проекта.

0 голосов
/ 29 ноября 2012
def render_file(filename)
  contents = File.read('views/'+filename)
  Haml::Engine.new(contents).render
end
...