Ruby erb模板'或'操作者

时间:2014-03-25 20:19:59

标签: erb puppet

我有一个使用erb模板的木偶清单。我写了很多木偶清单,我是ruby / erb模板的新手。

这是根据文档的正确语法,并且它完美地运行。

<% if foo != bar %>
  derp
<% else %> 
  herp
<% end %> 

如何将if语句与&#39;或&#39;结合使用?运营商?

以下是我尝试过的语法,但它们会返回错误:

<% if foo != bar  or  if slurp != burp %>
  derp
<% else %> 
  herp
<% end %> 

Error: Could not run: /etc/puppet/modules/gitlab/templates/gitlab.yml.6-7-stable.erb:275: syntax error, unexpected $end, expecting keyword_end
; _erbout.force_encoding(__ENCODING__)

我尝试将&lt;%更改为&lt; %%,因为puppet docs.

中提到了这一点
<%% if foo != bar  or  if slurp != burp %%>
  derp
<% else %> 
  herp
<% end %> 

Error: Could not run: /etc/puppet/modules/gitlab/templates/gitlab.yml.6-7-stable.erb:241: syntax error, unexpected keyword_else, expecting $end
;  else ; _erbout.concat "\n    derp   "
   ^

我试过拆分if-s

<% if foo != bar  %> or  <% if slurp != burp %>
  derp
<% else %> 
  herp
<% end %> 
Error: Could not run: /etc/puppet/modules/gitlab/templates/gitlab.yml.6-7-stable.erb:275: syntax error, unexpected $end, expecting keyword_end
; _erbout.force_encoding(__ENCODING__)
                                  ^

更新

我不知道为什么人们会投票给这个问题。第一种语法工作正常,但其他语法没有。

如果你打算投票,至少要解释原因。

3 个答案:

答案 0 :(得分:4)

还有一个if。正确的语法是:

<% if foo != bar  or slurp != burp %> 
  derp
<% else %> 
  herp
<% end %> 

但由于if-else构造错误,您的工作无效。阅读if-else construct。

的文档

答案 1 :(得分:1)

if / else块的Ruby语法是:

如果条件

条件可以包含任何逻辑运算符,例如&#39;或&#39;,&#39;和&#39;,&#39;&amp;&#39;,&# 39; |&#39;,&#39;&amp;&amp;&#39;,&#39; ||&#39;。

但是,不能包含另一个if块,例如:

如果foo!= bar或 if slurp!= burp

答案 2 :(得分:0)

ERB Ruby 1 。 ERB只是将标签中的Ruby和“内联文本”提取到代码和内联字符串/输出构建的混搭中,以生成中间的Ruby,然后执行。

因此,提取实际Ruby (由ERB执行)如下所示:

if foo != bar or if slurp != burp
  # some inconsequential ERB magic to output "derp"
else
  # some inconsequential ERB magic to output "herp"
end

现在,用虚拟表达式填充非感兴趣的部分会产生以下结果。 (忽略字符串总是truthy表达式;问题是语法错误。)

if "hello" or if "world"
else
end

这会产生预期的错误消息(请参阅ideone demo)。

  

prog.rb:3:语法错误,意外$ end

嗯.. 为什么

这是因为有两个 if - 表达式 2 ,但只关闭了一个并且代码已被解析为虽然已经添加了分组括号。

if "hello" or (if "world"
else
end) # <-- no `end` for `if "hello"`!

然后修复只是删除嵌套的if - 表达式。

# no extra `if` here, so only looking for one `end` below
if "hello" or "world"
else
end

1 更正确的说法是,ERB标记中的代码 Ruby,而ERB内部生成 Ruby,使用的内容为ERB标签直接。这与引入自己的语法和解析器的其他模板引擎不同。 ERB Ruby。

2 Ruby还支持expr if expr(和if expr then .. end)表单。无论如何,根本问题是增加了第二个不必要的if