1

私の Chef クックブック (mailman 用) では、ハッシュであり、テンプレートに書き込みたいすべての構成オプションを含む属性を使用したいと考えています ( chef-client クックブックでの方法と同様)。

だから私は私の属性に持っていたい:

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

出力として、次のものが必要です(mailman互換):

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 %>

それがRubyで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 に答える