2012-06-11 22 views
6

ich mit einem Rubin hash arbeite, die für die Schaffung eines neuen Teilnehmers in meinem MailChimp API-Schlüssel/Wert-Paare enthält.Rubin Hash-Schlüssel/Wert hinzufügen, wenn Modifikator

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

Natürlich, ich bin immer einen Syntaxfehler von syntax error, unexpected modifier_if ... Ich bin im Grunde nur die mmerge1 Basis hinzufügen will, auf dem bedingten wahr zu sein.

Antwort

11

Sie können if nicht innerhalb eines Hash-Initialisierungsblocks verwenden. Du musst bedingt den neuen Schlüssel/Wert hinzufügen, nachdem die Hash-Initialisierung:

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

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

Danke für die Hilfe! – 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

Das 'merge!' Fügt viel unnötige Komplexität für einen einzelnen Schlüssel/Wert hinzu. – meagar

+1

Auf der anderen Seite, 'fusionieren!' Ist nützlich, wenn mehrere * * Werte addiert. – tadman

0

Wenn mmerge1 erlaubt ist nil oder eine leere Zeichenfolge zu sein, können Sie den ?: ternären Operator in der Hash verwenden:

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

Sie könnten es 'nil' machen und' compact' nennen, oder 'ablehnen (&: blank?)'. –

+0

Viele Methoden interpretieren die * Anwesenheit * eines Schlüssels als Einstellung dieser Option, so dass dies kein gutes Muster für die allgemeine Praxis ist. – tadman

0

Wenn Sie einen Bedingungsausdruck für den Schlüssel verwenden, erhalten Sie eine einigermaßen lesbare Syntax und müssen höchstens ein Element aus dem Hash entfernen.

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