0

次のようなハッシュがあります。

items:
    item:
        attribute_a: cheese
        attribute_b: bacon
    item:
        attribute_a: salmon
    item:
        attribute_a: mushrooms
        attribute_b: steak

の値を取得したいのattribute_bですが、次を使用しています。

if (result['attribute_b'])
  // do something
end

ただし、attribute_bが見つからない場合は、エラーが発生します。

The Identifier specified does not exist, undefined method '[] for nil:NilClass'

attribute_b存在するかどうかを確認する (最善の) 正しい方法は何ですか?

4

2 に答える 2

2

attribute にアクセスしたときではなく、 nil'attribute_b'であるため、エラーが発生しているように見えます。result

The Identifier specified does not exist, undefined method [] for nil:NilClass`

[]nil 値でメソッドを呼び出していると言っています。あなたが ' []' を呼び出しているのは だけですresult

あなたがアクセスしている方法'attribute_b'は一般的に受け入れられます - 私はより具体的に言うかもしれません:

if (result && result.has_key? 'attribute_b')
 // do something
end

これにより、resultが存在し、属性が null でないことが確認されます。

于 2012-05-06T16:07:50.373 に答える
0

まず、あなたの YAML 構造は悪そうです (YAML ですか?)。itemキーは一意でなければならないため、キーを持つ複数の要素を持つハッシュを持つことはできません。代わりに配列を使用する必要があります。

ここの行に沿って YAML を構成することをお勧めします。

items:
  -
    attribute_a: cheese
    attribute_b: bacon
  -
    attribute_a: salmon
  -
    attribute_a: mushrooms
    attribute_b: steak

それからあなたはすることができます

require 'yaml'
result = YAML.load(File.open 'foo.yml')
result['items'][0]['attribute_b']
=> "bacon"
于 2012-05-06T16:12:41.003 に答える