Как я могу включить произвольный файл в шаблон HAML? - PullRequest
4 голосов
/ 19 мая 2011

Я хочу иметь независимые файлы .markdown, которые затем включаю в свои шаблоны haml.Поэтому я хочу как-то включить - не визуализировать - внешний шаблон в шаблон.Я хочу, чтобы родительский файл содержал :markdown, с включением непосредственно под ним, а затем файл .markdown будет просто уценкой.

Или: есть ли способ просто использовать уценку какязык шаблонов rails (так же, как я могу писать шаблоны или партиалы в erb или haml, а rails просто это выясняет)?

Ответы [ 5 ]

4 голосов
/ 19 мая 2011

Это похоже на ваше решение, но с использованием фильтра :markdown. Haml выполняет интерполяцию строк для любого отфильтрованного текста, поэтому вы можете прочитать файл уценки следующим образом.

:markdown
  #{File.read(File.join(File.dirname(__FILE__), "foo.markdown"))}

Вы можете поместить это в помощник, но вам нужно быть осторожным с путями к файлам.

2 голосов
/ 19 мая 2011

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

module Markdown
  class Template < ActionView::Template::Handler
    include ActionView::Template::Handlers::Compilable

    self.default_format = Mime::HTML

    def compile(template)
      '"' + Maruku.new(template.source).to_html + '".html_safe'
    end
  end
end

И затем зарегистрируйте его с расширением markdown (в application.rb или пользовательском инициализаторе):

ActionView::Template.register_template_handler(:md, Markdown::Template)

И затем пользователь рендерится так же, как и для любого частичного:)

# for file foo.md
= render 'foo'
0 голосов
/ 08 декабря 2011

Расширение ActionView::Template::Handler устарело как минимум в Rails 3.1.0. Вместо этого у меня сработало следующее:

В lib/markdown_views.rb:

require "rdiscount"

class MarkdownViews

  def call template
    'md = ERB.new(<<\'EOF\'%s
EOF
).result( binding)
    RDiscount.new( md).to_html.html_safe'% template.source
  end

end

В config/application.rb:

require "markdown_views"
ActionView::Template.register_template_handler :markdown, MarkdownViews.new

В views/public/home.html.markdown:

# H1

  + Bullets.
  + screaming.
  + from out of nowhere

<%= "Embedded Ruby" %>
0 голосов
/ 19 мая 2011

Это то, о чем я спрашивал разработчиков HAML некоторое время назад. Я предположил, что нам нужен фильтр :include для HAML. Их ответом было то, что мы должны загрузить файл в переменную, а затем использовать переменную, как и любую другую.

0 голосов
/ 19 мая 2011

Вот лучшее, что я могу придумать (без фильтра хамла):

=raw Maruku.new(File.read(File.dirname(__FILE__)+'/foo.markdown')).to_html
...