1

在我的 Chef 食谱(用于邮递员)中,我想使用一个哈希属性并包含我想要写入模板的所有配置选项(类似于在chef-client cookbook中的完成方式)。

所以我想在我的属性中有:

default[:myapp][:config] = {
  "I_AM_A_STRING" => "fooo",
  "I_AM_AN_INT" => 123,
  "I_AM_AN_ARRAY" => ["abc", "cde"]
}

作为输出,我想要以下内容(与邮递员兼容):

I_AM_A_STRING = 'fooo'
I_AM_AN_INT = 123
I_AM_AN_ARRAY = ['abc', 'cde']

但是,它不起作用。

为了调试问题,我的 erubis 模板中有以下代码:

<% node[:myapp][:config].each_pair do |key, value| -%>
  <% case value.class %>
  <% when Chef::Node::ImmutableArray %>
# <%= key %> is type <%= value.class %>, used when Chef::Node::ImmutableArray
<%= key %> = ['<%= value.join("','") %>']
  <% when Fixnum %>
# <%= key %> is type <%= value.class %>, used when Fixnum
<%= key %> = <%= value %> #fixnum
  <% when String %>
# <%= key %> is type <%= value.class %>, used when String
<%= key %> = '<%= value %>' #string
  <% else %>
# <%= key %> is type <%= value.class %>, used else
<%= key %> = '<%= value %>'
  <% end -%>
<% end -%>

所以我想用case .. when来区分value.class。但是,没有一个when条件匹配。所以输出是:

# I_AM_A_STRING is type String, used else
I_AM_A_STRING = 'fooo'
# I_AM_AN_INT is type Fixnum, used else
I_AM_AN_INT = '123'
# I_AM_AN_ARRAY is type Chef::Node::ImmutableArray, used else
I_AM_AN_ARRAY = '["abc", "cde"]'

当我尝试when Whatever.class时,第一个when匹配所有类型。

我究竟做错了什么?

4

1 回答 1

2

看起来你的意思

   <% case value %>

代替

  <% case value.class %>

这就是case..when在红宝石中的工作方式。通常情况下,您需要根据值(甚至是值的范围)以及类型进行切换。

它让你在 ruby​​ 中做这样的事情(因此也在 erubis/eruby 中):

def f(x)
  case x
    when String then "#{x} is a String"
    when 42 then "It's #{x==42}, x is 42"
    when 21..27 then "#{x} is in 21..27"
    when Fixnum then "#{x} is numeric, that's all I know"
    else "Can't say."
  end
end

f(1)        # "1 is numeric, that's all I know" 
f(25)       # "25 is in 21..27"  
f("hello")  # "hello is a String"
f(false)    # "Can't say."
于 2013-11-03T15:49:09.977 回答