6

テンプレートの最終的なテキスト出力に影響を与えることなく、ERBで印刷されていない論理行をフォーマットできる必要があります。現時点では、ERBがそのようなエスケープをサポートしているとは思いません。

これは私の最初の主要なRubyプロジェクトです。私はコードジェネレーターを書いています。私のテンプレートには、かなりの数の条件と列挙が含まれます。テンプレートを読みやすく保守しやすくするには、最終的な出力を歪めることなく、論理コードとコメントをフォーマットできる必要があります。

たとえば、次の出力が必要だとします。

Starting erbOutput
1
2
3
4
Ending erbOutput

私は素朴に次のようなテンプレートを作成しました。

require 'erb'
h=<<H
Starting erbOutput
<%# comment %>
<%5.times do |e|%>
<%=e.to_s  %>
<%end %>
<%# comment %>
Ending erbOutput
H
s=ERB.new(h).result
puts s

...しかしこれは

Starting erbOutput


0

1

2

3

4


Ending erbOutput

ストレートプリント:

"Starting erbOutput\n\n\n0\n\n1\n\n2\n\n3\n\n4\n\n\nEnding erbOutput\n"

...ロジック行とコメント行の行戻りがERB出力に含まれていることを明確にします。

テンプレートをこの厄介な形式に詰め込むことで、目的の出力を生成できます。

h=<<H
Starting erbOutput<%# comment %>
<%5.times do |e|%><%=e.to_s  %>
<%end %><%# comment %>Ending erbOutput
H

...しかし、より読みやすいフォーマットなしでテンプレートをデバッグおよび保守できるとは思いません。私の条件文と列挙のいくつかは、3レベルもの深さであり、私は重くコメントします。これらすべてを1行または2行に詰め込むと、テンプレートが完全に判読できなくなります。

ERBのコメント行のロジックの行リターンをエスケープまたは抑制する方法はありますか?他の一般的に利用可能なRubyテンプレートモジュールの1つは、これをより適切に処理しますか?

重要な場合は、MacOS10.6.7のMacRuby0.10(Ruby 1.9.2を実装)で作業しています。

4

4 に答える 4

4

マイナス記号?

<%# comment -%>
<% 5.times do |e| -%>
<%= e.to_s  -%>
<% end -%>
<%# comment -%>
于 2011-05-11T19:55:54.103 に答える
3

Rom1とKyleが示唆しているように、パラメーターをERB.newに渡すことはできますが、そうすると、必要な場所で改行ができなくなります。

require 'erb'
h=<<H
Starting erbOutput
<%# comment %>
<%5.times do |e|%>
<%=e.to_s  %>
<%end %>
<%# comment %>
Ending erbOutput
H
s=ERB.new(h, nil, '<>').result
puts s

あなたにあげる

Starting erbOutput
01234Ending erbOutput

したがって、余分な行を明示的に挿入する必要があります

require 'erb'
h=<<H
Starting erbOutput
<%# comment %>
<%5.times do |e|%>
<%=e.to_s  %>

<%end %>
<%# comment %>
Ending erbOutput
H
s=ERB.new(h, nil, '<>').result
puts s

これにより、次のようになります。

Starting erbOutput
0
1
2
3
4
Ending erbOutput
于 2011-05-11T20:08:39.193 に答える
1

erbの設定を変更できます。簡単なチュートリアルは次のとおりです:http ://www.ruby-forum.com/topic/55298

于 2011-05-11T19:51:13.223 に答える
0

erb -T 1 foo.erb

ライブラリには同等のオプション(おそらくtrim_modector param)があると思います。

于 2011-05-11T19:46:35.170 に答える