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

内部の文字列に出力を収集するのではなく、印刷することを好む複雑な構造があると想像してください<%= %>


アップデート

ブライアンの答えを説明するために:

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 に答える