通过以下方式输出haml内容:ruby filter

时间:2013-06-26 19:26:10

标签: ruby haml middleman

当我使用:ruby过滤器在haml中执行一些简单的操作时,例如......

:ruby
  to = comments > max_comments ? max_comments : comments
  (0...to).each do |i|
    comment = data[i]
    puts li_comment comment[0], comment[1], comment[2]
  end

puts语句将输出写入控制台。 docs for :ruby表示它

  

创建一个名为haml_io的IO对象,输出写入的任何内容   进入Haml文件。

一个如何使用 haml_io对象写入haml文档,而不是写入控制台(我认为我需要puts以外的其他内容)?

3 个答案:

答案 0 :(得分:4)

此行为changed recently - 旧行为(4.0版之前)是将写入标准的任何内容写入Haml文档,但这不是线程安全的。

haml_iolocal variable that refers to an IO object that writes to the document。您重写代码以使用它看起来像这样(假设commentsmax_commentsli_comment都是先前定义的):

:ruby
  to = comments > max_comments ? max_comments : comments
  (0...to).each do |i|
    comment = data[i]
    haml_io.puts li_comment comment[0], comment[1], comment[2]
  end

haml_io实际上是StringIO object,因此您可以使用其任何方法,例如haml_io.writehaml_io.putc,它会将输出重定向到您的文档。

答案 1 :(得分:0)

...致电haml_io

  

写入的任何内容都会输出到Haml文档中。

答案 2 :(得分:0)

请注意,如果您将https://github.com/k0kubun/hamlit用作渲染器而不是普通的https://github.com/haml/haml,则其语法也会有所不同。看来您只需要从过滤器中返回所需的值即可。

似乎没有标准的haml API起作用:

[46] pry(main)> Hamlit::Template.new() { ":ruby\n  puts 'aaa'" }.render
aaa
=> ""

[47] pry(main)> Hamlit::Template.new() { ":ruby\n  haml_io.puts 'aaa'" }.render
NameError: undefined local variable or method `haml_io' for #<Object:0x00007f9ec2f178a0>
from (__TEMPLATE__):1:in `__tilt_70159905806200'

[49] pry(main)> Hamlit::Template.new() { ":ruby\n  'aaa'" }.render
=> ""

但是,如果您从:ruby过滤器返回,则会得到输出:

[50] pry(main)> Hamlit::Template.new() { ":ruby\n  return 'aaa'" }.render
=> "aaa"

我打开了一个与此相关的问题,以供参考:https://github.com/k0kubun/hamlit/issues/152