当我使用: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
以外的其他内容)?
答案 0 :(得分:4)
此行为changed recently - 旧行为(4.0版之前)是将写入标准的任何内容写入Haml文档,但这不是线程安全的。
haml_io
是local variable that refers to an IO object that writes to the document。您重写代码以使用它看起来像这样(假设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
object,因此您可以使用其任何方法,例如haml_io.write
,haml_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