【问题标题】:HAML filters in a helper帮助程序中的 HAML 过滤器
【发布时间】:2014-11-06 11:51:10
【问题描述】:

Helper 函数可以接收他们yield 的块来渲染块。有时我希望该块带有过滤器。比如:

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

这不是那么 DRY,因为我们总是一起编写 doc_page 和 markdown。我可以让辅助方法接受一个块并通过 HAML 过滤器传递它吗?比如:

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

在这个幻想中,doc_page 是一个辅助方法,它会做一些设置,然后通过 markdown 传递内容,从而使我们无需在任何地方声明 :markdown 并使世界成为一个 DRYer 的地方。

【问题讨论】:

  • 这个问题不清楚。您到底想在助手内部做什么?将 Haml 块渲染为 HTML?
  • 更新了问题。我正在尝试制作一个输出标题然后通过降价传递块的助手,以节省每次都必须在助手调用下放置一个单独的 :markdown 声明。
  • 不重要,但是:为什么要通过标题?为什么不在markdown 文本中包含它?它可能看起来更完整。另外,将降价文本放在单独的markdown 文件中,然后让助手加载它们不是更好吗?在我看来,这将更加优雅。另外,它可能更容易编辑,因为它只是纯粹的markdown;编辑器可能会更好地处理文件语法突出显示。
  • @JikkuJose 如果您有 100 个这样的页面并且您手动呈现标题,那么如果您想更改页面结构,例如在一个简单的情况下,如果您想将所有标题从 h2 更改为 h3。我并不是要过度设计,但在实践中,这种大规模重构确实时不时发生。
  • @mahemoff 很抱歉,但我仍然认为将所有内容都包含在降价文件中很优雅;显然这就是大多数静态站点生成器(如 Jekyll、Middleman 和大多数其他站点生成器)处理数据的方式。现在,谈到您更改标题样式的具体情况:坦率地说,通过 CSS 对所有页面标题进行样式更改非常容易吗?此外,如果你真的需要,你可以很容易地编写一个脚本来对所有页面进行编辑。

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


【解决方案1】:

目前无法在帮助程序中使用过滤器。另一种方法是使用 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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      怕是,不过不可能,因为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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-25
        • 1970-01-01
        • 1970-01-01
        • 2010-12-26
        • 2018-03-14
        相关资源
        最近更新 更多