HAML过滤助手

时间:2014-11-06 11:51:11

标签: ruby-on-rails ruby filter haml dry

辅助函数可以接收一个yield来渲染块的块。有时候我希望用过滤器指定该块。例如:

= doc_page title: 'FAQ' do
  :markdown
    # Welcome to the *FAQ*

这不是那么干,因为我们总是一起写doc_page和markdown。我可以让辅助方法接受一个块并将其传递给HAML过滤器。类似的东西:

= doc_page title: 'FAQ' do
  # Welcome to the *FAQ*

在这个幻想中,doc_page是一个辅助方法,可以执行一些设置工作,然后通过降价传递内容,从而使我们无需在任何地方声明:markdown并使世界成为干燥的地方。< / p>

3 个答案:

答案 0 :(得分:4)

目前无法在帮助程序中使用过滤器。另一种方法是使用redcarpet来解析markdown,然后将输出传递给帮助者。

一个例子是:

= doc_page title: 'FAQ', :markdown do
  ### my markdown

= doc_page title: 'FAQ' do
  normal html

doc_page的实现将是这样的:

def doc_page(title, markup=:html)

  content = yield

  if markup == :markdown
    markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML)
    content = markdown.render(content)
  end

  content
end

这将解决您的问题,因为您在帮助程序中定义了降价过滤器。而且你的haml中不需要额外的缩进级别。

答案 1 :(得分:2)

您可以直接使用倾斜(api haml用于渲染降价)而不是通过haml。可能是这样的(未经测试)。

markdown_template = Tilt['md'].new { "# this is markdown code" }
markdown_template.render

您可以在Tilt docs中找到类似的示例。 但这更像是一个想法,而不是一个完整的实现。

答案 2 :(得分:2)

我很害怕,但这是不可能的,因为haml是preprocessor,基本上是这段代码:

= doc_page title: 'FAQ' do
  # Welcome to the *FAQ*
  %a href="/" link

将在运行时的ruby代码中转换为:

concat(doc_page title: 'FAQ' do
  # Welcome to the *FAQ*
  concat('<a href="/">link</a>')
end)