2012-06-11 14 views
6

Sto lavorando con un rubino hash che contiene coppie chiave/valore per la creazione di un nuovo iscritto nella mia API MailChimp.ruby ​​hash aggiungi chiave/valore se modificatore

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

Ovviamente, sto ottenendo un errore di sintassi di syntax error, unexpected modifier_if ... Sono fondamentalmente solo voglia di aggiungere il mmerge1 in base all'operazione da vero il condizionale.

risposta

11

Non è possibile utilizzare if in questo modo, all'interno di un blocco di hash-inizializzazione. Dovrete aggiungere condizionalmente la nuova chiave/valore dopo l'inizializzazione del hash:

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

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

Grazie per l'aiuto! – 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

"unire!" Aggiunge un sacco di complessità non necessaria per una singola chiave/valore. – meagar

+1

D'altra parte, 'unire!' È utile quando si aggiungono * più * valori. – tadman

0

Se mmerge1 è consentito di essere nil o una stringa vuota, è possibile utilizzare l'operatore ternario ?: all'interno del hash:

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

Si potrebbe renderlo 'nil' e chiamare' compact', o fare 'reject (&: blank?)'. –

+0

Molti metodi interpretano la * presenza * di un tasto come impostazione di tale opzione, quindi questo non è un buon modello da utilizzare nella pratica generale. – tadman

0

Se si utilizza un'espressione condizionale sul tasto si ottiene una sintassi ragionevolmente leggibile e, al massimo, è necessario rimuovere solo 1 elemento dall'Hash.

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