2009-09-06 4 views
7

Я использую HAML для создания некоторых статических html-страниц для сайта, и я хотел разделить общие компоненты на частичные, которые я могу включить на нескольких страницах, как в Rails , Однако я не хочу использовать весь Rails-стек, чтобы сделать это, поскольку он кажется излишним.Рендеринг частичных HAML изнутри HAML за пределами Rails

Я посмотрел вокруг в Интернете, но ничего, лучше, чем просто делать что-то вроде не нашел:

Haml::Engine.new(IO.read("header.haml")).render 

Есть ли лучше способ включения так называемых парциальных изнутри Haml? Существующий фильтр или команда, которую я пропускаю?

ответ

6

Лучше всего объединить haml & sass с инструментом для создания статических веб-сайтов. Вот некоторые ссылки:

Я использую Джекил для моего блога, но если вы не строить блог это, вероятно, не подходит для ваших нужд.

+0

Хотя Джекил выглядит красиво , это в значительной степени сделано для блогов. Хотя StaticMatic, похоже, именно то, что я хочу. Я думал о том, чтобы реализовать что-то подобное себе (т. Е. Использовать Erb как pre/post-processor для шаблонов Haml, например, C compilers worl). Спасибо – Daemin

3

Darn, вы правы - нет встроенного способа. Я использовал помощники с командной строкой haml, но всегда те, чей вывод уже был отформатирован HTML.

Мое лучшее предложение - написать метод partial() и потребовать его. Похоже, вы уже начали этот путь. Я хотел бы предложить, чтобы кто-нибудь написал такую ​​функцию, рассматривая каким-то образом привязку оригинала. Haml::Helpers#capture_hame выглядит как самый простой способ сделать это.

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

Если кто-то действительно работает, пожалуйста, поставьте его на GitHub и сделайте здесь комментарий.

0

Все решения казались громоздкими для моих целей, хотя я пытаюсь сделать в основном то же самое. Вот рубиновый скрипт, который я написал, который мало ценен - ​​оценивает Haml с возможностью вставлять в = partial "test.haml" в любом месте. Он делает тривиальное количество логики, чтобы попытаться найти частичный файл.

require 'haml' 

def find filename 
    return filename if File.exists? filename 
    path = File.dirname ARGV[0] 
    filename = path+"/"+filename 
    return filename if File.exists? filename 
    throw "Could not find file." 
end 

def partial filename 
    source = File.read(find(filename)) 
    engine = Haml::Engine.new(source) 
    engine.render(binding) 
end 

puts partial ARGV[0] 

вы выполнить его так: рубин hamlize.rb input.haml> output.html

0

У меня была такая же проблема. Мне нужно было сгенерировать некоторые html-фрагменты для оптимизации ответа сервера, как только эти фрагменты будут иметь множество вычислений (для рисования графиков), и каждый раз, когда пользователь делает запрос, он делает все ненужное.

Как только у меня есть представления, разделенные на несколько частей хамла, я хотел бы использовать его для генерации html-файлов.

Мой первый подход пытался с движком Haml, но как только у меня есть частичные частичные рендеринг других частичных функций и некоторые функции помощника приложения, это не сработало. Окончательность я нашел решение, которое прошло с создания функции в моделях, которые я хотел, чтобы создать HTML-файл (to_html) Вот он:

def to_html 
    ActionView::Base.send :include, ActionView::Helpers::ApplicationHelper 

    File.open(File.join(Rails.root, "public", 'test.html'), "w") do |file| 

    file.print ActionView::Base.new(Rails.configuration.paths["app/views"].first).render(
       :partial => 'partial_folder/partial', 
       :format => :html, 
       :locals => { :model => self} 
      ) 
    end 
end 

Таким образом, я смог использовать уже сделанные партиалы, для печати html-файлов. Это сработало для меня, может быть, это тоже поможет.

0

Я наконец нашел то, что искал, поэтому решил, что поделюсь с вами своей находкой. Вы можете просто использовать тот же синтаксис, который вы используете для Haml в первую очередь - http://www.semicomplete.com/blog/geekery/partials-in-haml-in-sinatra.html

/views/file.haml

%h3 Title 
%div= haml :content, :layout => false 

/views/content.haml

%p your content here 
+0

Я только заметил, что если вы хотите передать своих местных жителей, вам нужно добавить «: locals => locals» в оператор «haml: content» – AxelTheGerman

Смежные вопросы