2014-11-06 50 views
4

帮助程序功能可以接收它们yield来呈现该块的块。有时候我想让这个块用过滤器来指定。例如:帮助程序中的HAML过滤器

= 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无处不在,让世界变得干燥的地方。

+0

这个问题还不清楚。你在辅助者里究竟想做什么?将Haml块渲染为HTML? – Substantial 2014-11-09 10:38:40

+0

更新了问题。我试图做一个帮助器输出一个标题,然后通过markdown传递该块,以节省每次在帮助器调用下放置单独的':markdown'声明。 – mahemoff 2014-11-09 14:53:17

+0

不重要,但是:为什么要通过标题?为什么不用'markdown'文本本身呢?它可能看起来更完整。另外,将降价文本放在单独的“降价”文件中,然后让帮助者加载它们,不是更好吗?在我看来,这将更加优雅。另外,它可能更容易编辑,因为它只是纯粹的'markdown';编辑可能会更好地处理文件语法突出显示。 – 2014-12-11 04:24:59

回答

4

目前在助手中不可能使用过滤器。另一种方法是使用redcarpet解析降价,然后将输出传递给助手。

一个例子是:

= 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 

这将解决你的问题,因为你在帮助定义降价过滤器。你不需要额外的缩进级别。

2

你可以直接使用tilt(api haml用来渲染markdown)而不是通过haml。可能是这样的(未测试)。

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

你可以在Tilt docs找到一个类似的例子。 但是,这不是一个完整的实现。

2

我很害怕,但它是不可能的,因为HAML是preprocessor,basicly这段代码:

= 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)