首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让if或unless语句在erb模板中跨多行工作

如何让if或unless语句在erb模板中跨多行工作
EN

Stack Overflow用户
提问于 2015-06-19 05:54:11
回答 1查看 2.6K关注 0票数 1

我正在尝试将一些逻辑写到厨师食谱中的erb模板。我有以下几点,我认为它们会起作用。目前该属性为nil,但它并没有像我想象的那样跳过整个代码块。如何让top语句使模板读取器跳过整个代码块?

代码语言:javascript
复制
    <% unless node['base']['logstash-forwarder']['nginx'].nil? %>
      <%= "{" %>
      <%= "\"paths\": [" %>
      <% node['base']['logstash-forwarder']['nginx'].each do |path| %>
        <% unless path.equal? node['base']['logstash-forwarder']['nginx'].last %>
        <%= "\"#{path}\"," %>
        <% end %>
      <% end %>
    <%= "\"#{node['base']['logstash-forwarder']['nginx'].last}\"" %>
    <%= " ]," %>
    <%= "\"fields\": { \"type\": \"nginx-access\" }" %>
    <%= "}" %>
  <% end %>
EN

回答 1

Stack Overflow用户

发布于 2015-06-19 06:21:39

上面的代码在ERB中完全按照预期工作,请参见:

代码语言:javascript
复制
[122] pry(main)> e = ERB.new <<'EOI'
[122] pry(main)*  <% unless node['base']['logstash-forwarder']['nginx'].nil? %>
[122] pry(main)*       <%= "{" %>
[122] pry(main)*       <%= "\"paths\": [" %>
[122] pry(main)*       <% node['base']['logstash-forwarder']['nginx'].each do |path| %>
[122] pry(main)*         <% unless path.equal? node['base']['logstash-forwarder']['nginx'].last %>
[122] pry(main)*         <%= "\"#{path}\"," %>
[122] pry(main)*         <% end %>
[122] pry(main)*       <% end %>
[122] pry(main)*     <%= "\"#{node['base']['logstash-forwarder']['nginx'].last}\"" %>
[122] pry(main)*     <%= " ]," %>
[122] pry(main)*     <%= "\"fields\": { \"type\": \"nginx-access\" }" %>
[122] pry(main)*     <%= "}" %>
[122] pry(main)*   <% end %>
[122] pry(main)* EOI
=> #<ERB:0x007fe74bb35ff8
 @encoding=#<Encoding:UTF-8>,
 @filename=nil,
 @lineno=0,
 @safe_level=nil,
 @src=
  "#coding:UTF-8\n_erbout = ''; _erbout.concat \" \";  unless node['base']['logstash-forwarder']['nginx'].nil? ; _erbout.concat \"\\n      \"\n; _erbout.concat(( \"{\" ).to_s); _erbout.concat \"\\n      \"\n; _erbout.concat(( \"\\\"paths\\\": [\" ).to_s); _erbout.concat \"\\n      \"\n;  node['base']['logstash-forwarder']['nginx'].each do |path| ; _erbout.concat \"\\n        \"\n;  unless path.equal? node['base']['logstash-forwarder']['nginx'].last ; _erbout.concat \"\\n        \"\n; _erbout.concat(( \"\\\"\#{path}\\\",\" ).to_s); _erbout.concat \"\\n        \"\n;  end ; _erbout.concat \"\\n      \"\n;  end ; _erbout.concat \"\\n    \"\n; _erbout.concat(( \"\\\"\#{node['base']['logstash-forwarder']['nginx'].last}\\\"\" ).to_s); _erbout.concat \"\\n    \"\n; _erbout.concat(( \" ],\" ).to_s); _erbout.concat \"\\n    \"\n; _erbout.concat(( \"\\\"fields\\\": { \\\"type\\\": \\\"nginx-access\\\" }\" ).to_s); _erbout.concat \"\\n    \"\n; _erbout.concat(( \"}\" ).to_s); _erbout.concat \"\\n  \"\n;  end ; _erbout.concat \"\\n\"\n; _erbout.force_encoding(__ENCODING__)">
[123] pry(main)> node = { 'base' => { 'logstash-forwarder' => {}}}
=> {"base"=>{"logstash-forwarder"=>{}}}
[124] pry(main)> path = nil
=> nil
[125] pry(main)> e.result binding
=> " \n"
[126] pry(main)> 

所以问题是要么是Chef做了一些奇怪的事情(看起来不太可能),要么你的node并不像你想象的那样nil?

更新

从字里行间读取信息,特别是在调用.each.last时,是否可能您的node['base']['logstash-forwarder']['nginx']实际上不是nil,而是[]

如果是这样,请将您的.nil?检查更改为.empty?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30926443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档