2012-06-11 21 views
6

Estoy trabajando con un ruby ​​hash que contiene pares de clave/valor para crear un nuevo suscriptor en mi API de MailChimp.hash de ruby ​​agregar clave/valor si modificador

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

Obviamente, estoy consiguiendo un error de sintaxis de syntax error, unexpected modifier_if ... estoy básicamente sólo se desean agregar el mmerge1 basado en ser fiel el condicional.

Respuesta

11

no puede utilizar if de esa manera, dentro de un bloque de hash-inicialización. Vas a tener que añadir condicionalmente la nueva clave/valor después de inicializar el hash:

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

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

¡Gracias por la ayuda! – 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

El 'merge!' Agrega mucha complejidad innecesaria para una sola clave/valor. – meagar

+1

Por otro lado, 'merge!' Es útil al agregar * valores * múltiples. – tadman

0

Si mmerge1 se le permite ser nil o una cadena vacía, se puede utilizar el operador ternario ?: dentro de la almohadilla:

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

Puedes hacer que sea 'nil' y llamar' compact', o '' rechazar (&: blank?) '. –

+0

Muchos métodos interpretarán la * presencia * de una tecla como la configuración de esa opción, por lo que este no es un buen patrón para usar en la práctica general. – tadman

0

Si utiliza una expresión condicional en la clave obtendrá una sintaxis razonablemente legible y, como máximo, tendrá que eliminar solo 1 elemento del 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