4

当我使用: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语句将输出写入控制台。:ruby的文档表明它

创建一个名为 的 IO 对象haml_io,写入它的任何内容都会输出到 Haml 文档中。

究竟如何使用haml_io 对象写入 haml 文档,而不是写入控制台(认为我需要的东西不是puts)?

4

3 回答 3

6

这种行为最近发生了变化——旧行为(4.0 版之前)是将任何写入标准的内容写入 Haml 文档,但这不是线程安全的。

haml_io是一个局部变量,它引用写入文档的 IO 对象。使用它重写的代码看起来像这样(假设comments,max_comments并且li_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对象,因此您可以使用它的任何方法,例如haml_io.writehaml_io.putc它会将输出重定向到您的文档。

于 2013-06-26T19:52:49.530 回答
0

... 通话播放haml_io

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

于 2013-06-26T19:32:21.007 回答
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

于 2019-12-02T22:57:12.950 回答