【问题标题】:Escaping Line-Returns/End-of-Line in ERB templates在 ERB 模板中转义换行符/行尾
【发布时间】:2011-05-11 19:38:56
【问题描述】:

我需要能够在不影响模板最终文本输出的情况下格式化 ERB 中未打印的逻辑行。在这一点上,我认为 ERB 不支持这种转义。

这是我的第一个主要 Ruby 项目。我正在编写代码生成器。我的模板将包含大量条件和枚举。为了使模板具有可读性和可维护性,我需要能够在不扭曲最终输出的情况下格式化逻辑代码和 cmets。

例如假设我想要这个输出:

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

...但我认为如果没有更可读的格式,我就无法调试和维护模板。我的一些条件和枚举的深度多达三个级别,我对此进行了大量评论。将所有内容塞进一两行会使模板完全不可读。

有没有办法逃避或以其他方式抑制 ERB 中逻辑注释行的行返回?其他常用的 Ruby 模板模块是否能更好地处理这个问题?

以防万一,我在 MacOS 10.6.7 上使用 MacRuby 0.10(实现 Ruby 1.9.2)。

【问题讨论】:

    标签: ruby formatting erb macruby


    【解决方案1】:

    减号?

    <%# comment -%>
    <% 5.times do |e| -%>
    <%= e.to_s  -%>
    <% end -%>
    <%# comment -%>
    

    【讨论】:

    • 我的默认 Ruby 1.8.7 和 Macruby 0.10 (Ruby 1.9.2) 都不会接受这个。
    • @TechZen,将“-”作为第三个参数传递给 ERB.new 以启用此行为。
    【解决方案2】:

    正如 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
    

    【讨论】:

    • 答案一直在 ERB 文档中。奇怪用你不熟悉的语言使用文档是多么困难。这适用于标准 Ruby 1.8.7,但在 Macruby 下会因LocalJumpError: no block given 而失败。我想现在我必须弄清楚这是 ruby​​ 1.9.2 问题还是(更有可能)是 macruby 问题。
    • 看起来这是一个已知的 Macruby 问题,现已修复:macruby.org/trac/ticket/1252
    【解决方案3】:

    您可以更改 erb 的设置。 这是一个快速教程:http://www.ruby-forum.com/topic/55298

    【讨论】:

      【解决方案4】:

      erb -T 1 foo.erb

      我想库中有一个等效的选项(可能是trim_mode ctor 参数)。

      【讨论】:

        猜你喜欢
        • 2011-06-05
        • 2011-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多