0

我通过控制台使用 ERB 进行元编程(用于数学软件)。例如,我有文件test.erb包含

text line before ruby
<%=  'via <%='  %>
<%  print 'print'  %>
<%  puts  'puts'   %>
text line after ruby

当我解析它时$ erb test.erb,我得到以下输出

printputs
text line before ruby
via <%=


text line after ruby

我对此并不感到惊讶,但想知道是否有一种很好的方法可以捕获print方法的输出并将其放在 ERB 模板中调用它的地方?

text line before ruby
via <%=
print
puts
text line after ruby

想象一下,我有一个复杂的结构,我宁愿打印而不是在内部的字符串中收集输出<%= %>


更新

只是为了说明Brian的答案:

text line before ruby
<%= '<%=' %>
% print 'print'
% puts 'puts'
% E = _erbout
% E << '_erbout'+"\n"
text line after ruby

解析文件$ erb test.erb

printputs
text line before ruby
<%=
_erbout
text line after ruby
4

2 回答 2

2

不确定这是否对您的特定情况有帮助,但请考虑使用 _erbout 方法查看一些示例

text line before ruby
<%=  'via <%='  %>
<% _erbout << 'print' %>
<% _erbout << 'puts'  %>
text line after ruby

希望这能让你有所收获。

于 2010-07-15T14:47:21.453 回答
0

作为一种选择,可以重新定义Kernel#p方法:

文件:p_for_erb.rb

module Kernel
  alias :p_super :p

  def p *args
    if args.empty?
      @@_erbout
    elsif args.first.class == Hash
      @@_erbout = args.first[:init]
    else
      args.each { |a| @@_erbout << a }
    end
  end
end

...然后做类似的事情:

文件:mytest.erb

text before ruby
% require 'p_for_erb'
% p init: _erbout # to initialize class variable @@_erbout
% p "my p output"

命令$ erb mytest.erb产生

text before ruby
my p output
于 2010-07-16T14:58:43.080 回答