2012-06-11 13 views
6

MailChimp APIで新規サブスクライバを作成するためのキーと値のペアを含むルビーhashを使用しています。ルビ・ハッシュ・キー修飾子の場合の値

user_information = { 
    'fname' => 'hello world', 
    'mmerge1' => 'Product X' if user.product_name.present? 
} 

もちろん、私は基本的にのみ、条件が真であることに基づいてmmerge1を追加したいと思っています... syntax error, unexpected modifier_ifの構文エラーを取得しています。

答えて

11

このように、ifは、ハッシュ初期化ブロック内で使用できません。あなたは条件付きハッシュを初期化した後、新しいキー/値を追加する必要があります:

user_information = { 
    'fname' => 'hello world', 
} 

user_information['mmerge1'] = 'Product X' if user.product_name.present? 
+0

助けてくれてありがとう! – dennismonsewicz

1
user_information = {'fname' => 'hello world'} 
user_information.merge!({'mmerge1' => 'Product X'}) if user.product_name.present? 
#=> {"fname"=>"hello world", "mmerge1"=>"Product X"} 
+1

「merge!」は、単一のキー/値に多くの不要な複雑さを追加しています。 – meagar

+1

他方、 'merge!'は*複数の値を追加するときに便利です。 – tadman

0

mmerge1はあなたがハッシュ内?:三項演算子を使用することができ、nilまたは空の文字列であることを許可されている場合:

user_information = { 
    'fname' => 'hello world', 
    'mmerge1' => user.product_name.present? ? 'Product X' : '' 
} 
+0

'nil'にして' compact'を呼び出すか、 'reject(&:blank?)'を実行することができます。 –

+0

多くの方法は、キーの存在を*そのオプションを設定するものとして解釈するので、これは一般的なプラクティスで使用するのに良いパターンではありません。 – tadman

0

キーで条件式を使用すると、合理的に読み取り可能な構文が得られ、たいていはハッシュから1つの要素のみを削除する必要があります。

product_name = false 
extra_name = false 

user_information = { 
    'fname' => 'hello world', 
    product_name ? :mmerge1 : nil => 'Product X', 
    extra_name ? :xmerge1 : nil => 'Extra X' 
} 
user_information.delete nil 

p user_information