如何将任意文件包含到HAML模板中?

时间:2011-05-18 23:14:40

标签: ruby-on-rails ruby haml

我希望拥有独立的.markdown文件,然后将其包含在我的haml模板中。所以我想以某种方式包括 - 不渲染 - 外部文件到模板中。我希望父文件中包含:markdown,其中包含正文,然后是.markdown文件,只是纯粹的降价。

或者:有没有办法只使用markdown作为rails模板语言(同样的方式我可以在erb或haml和rails中编写模板或局部文件来解决它)?

5 个答案:

答案 0 :(得分:4)

这与您的解决方案类似,但使用:markdown过滤器。 Haml对任何已过滤的文本进行字符串插值,因此您可以像这样读取降价文件。

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

你可以把它放到帮助器中,但是你必须小心文件路径。

答案 1 :(得分:2)

我能想到的最简单的方法是给Markdown create a custom template handler。你可以使用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'

答案 2 :(得分:0)

这是我能想到的最好的(根本没有涉及haml过滤器):

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

答案 3 :(得分:0)

这是我向HAML开发人员提出的问题。我建议我们需要一个:include过滤器用于HAML。他们的回答是我们应该将文件加载到变量中,然后像使用其他任何变量一样使用变量。

答案 4 :(得分:0)

至少在Rails 3.1.0中不推荐使用扩展ActionView::Template::Handler。相反,以下工作对我有用:

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" %>