Подтвердить что ты не робот

Частичный шаблон 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, очевидно, не путь сюда. Но это хорошая работа, описывающая то, что я пытаюсь достичь в этом примере.

4b9b3361

Ответ 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 в ваших шаблонах проектов или частичный каталог.