2012-06-11 28 views
6

MailChimp API'mde yeni bir abone oluşturmak için anahtar/değer çiftleri içeren bir ruby ​​hash ile çalışıyorum.ruby ​​hash değiştirici varsa anahtar/değer ekleyin

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

Açıkçası, ben temelde sadece koşullu gerçek olduğu varsayımına göre mmerge1 eklemek isteyen ediyorum ... syntax error, unexpected modifier_if bir sözdizimi hatası alıyorum.

cevap

11

if'u bu şekilde, karma başlatma bloğu içinde kullanamazsınız. mmerge1nil izin veya boş bir dize, sen karma içine ?: üçlü operatörü kullanabiliyorsa

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

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

Yardım için teşekkürler! – 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

"Birleştirme!", Tek bir anahtar/değer için çok fazla gereksiz karmaşıklık ekliyor. – meagar

+1

Diğer taraftan, 'birleştirme!' * * * * * Değerlerini eklerken kullanışlıdır. – tadman

0

:

Sen şartlı karma başlatılıyor sonra yeni bir anahtar/değer katmak gerekecek
+0

Bunu 'nil' yapıp 'compact' diyebilir ya da reddedebilirsiniz (&: boş?). –

+0

Birçok yöntem, bir anahtarın * varlığını * o seçeneği belirlerken yorumlayacaktır, bu genel uygulamada kullanmak için iyi bir model değildir. – tadman

0

Anahtarda bir koşullu ifade kullanırsanız, makul olarak okunabilir bir sözdizimi alırsınız ve en fazla, yalnızca 1 öğeyi Karma'dan kaldırmanız gerekir.

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 
İlgili konular