我有一个使用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__)
^
更新
我不知道为什么人们会投票给这个问题。第一种语法工作正常,但其他语法没有。
如果你打算投票,至少要解释原因。
答案 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
。