ERB 扩展仿真 -%> 用于单元测试

Emulation for ERB extention -%> for the purpose of unittests

我需要评估一个 ERB 模板,然后确保它是一个有效的 NGINX 配置文件,但普通 ERB 不允许 -%> 指令。我怎样才能将该扩展添加到我的 rakefile 中?

我已经能够在 irb 中重现该问题:

~ $ irb
irb(main):001:0> require 'erb'
=> true
irb(main):002:0> var = "yeah"
=> "yeah"
irb(main):003:0> ERB.new(" <% if var == 'yeh' -%>
irb(main):004:1"    something
irb(main):005:1"    <% else -%>
irb(main):006:1"    something else
irb(main):007:1"    <% end -%>
irb(main):008:1" ").result binding #"
SyntaxError: (erb):1: syntax error, unexpected ';'
...concat " ";  if var == 'yeh' -; _erbout.concat "\nsomething\...
...                               ^
(erb):3: syntax error, unexpected keyword_else, expecting $end
;  else -; _erbout.concat "\nsomething else\n"
       ^
    from /usr/lib/ruby/1.9.1/erb.rb:838:in `eval'
    from /usr/lib/ruby/1.9.1/erb.rb:838:in `result'
    from (irb):3
    from /usr/bin/irb:12:in `<main>'

为了在 ERB 中使用 -%> 语法,您需要设置 trim mode option to '-'。这是构造函数的第三个选项,您需要将 nil 作为第二个选项传递(除非您想更改默认的 safe_level):

ERB.new(" <% if var == 'yeh' %>
    something
    <% else %>
    something else
    <% end %>
 ", nil, '-').result binding

如果没有此选项,- 将包含在生成的 Ruby 脚本中,并在您尝试 运行 时给出语法错误。

请注意,还有另一个 eRuby 处理器,Erubis which might have slightly different options (it can still use this syntax)。这个被Rails使用了。查看文档了解更多信息。