我正在尝试将一些逻辑写到厨师食谱中的erb模板。我有以下几点,我认为它们会起作用。目前该属性为nil,但它并没有像我想象的那样跳过整个代码块。如何让top语句使模板读取器跳过整个代码块?
<% 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 %>发布于 2015-06-19 06:21:39
上面的代码在ERB中完全按照预期工作,请参见:
[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?
https://stackoverflow.com/questions/30926443
复制相似问题