2012-06-11 16 views
6

Pracuję z rubinem hash, który zawiera pary klucz/wartość do tworzenia nowego subskrybenta w moim interfejsie API MailChimp.hash ruby ​​dodaj klucz/wartość, jeśli modyfikator

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

Oczywiście, ja otrzymuję błąd składni syntax error, unexpected modifier_if ... Ja w zasadzie tylko chcąc dodać mmerge1 oparciu będąc warunkowego prawda.

Odpowiedz

11

Nie można używać if ten sposób, wewnątrz bloku hash-inicjalizacji. Musisz warunkowo dodać nowy klucz/wartość po uruchomieniu skrótu:

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

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

Dzięki za pomoc! – 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

Funkcja "scalaj!" Dodaje wiele niepotrzebnych komplikacji dla pojedynczego klucza/wartości. – meagar

+1

Z drugiej strony "scalanie!" Jest przydatne przy dodawaniu * wielu * wartości. – tadman

0

Jeśli mmerge1 może być nil lub pusty ciąg znaków, można użyć operatora potrójny ?: wewnątrz hash:

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

Możesz zrobić to 'nil' i wywołać' compact', czy też 'reject (&: blank?)'. –

+0

Wiele metod interpretuje * obecność * klucza jako ustawienie tej opcji, więc nie jest to dobry wzór do zastosowania w praktyce ogólnej. – tadman

0

Jeśli użyjesz warunkowego wyrażenia na kluczu, otrzymasz rozsądnie czytelną składnię i, co najwyżej, usuniesz tylko 1 element z skrótu.

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