2012-06-11 37 views
6

Tôi đang làm việc với một ruby ​​hash có chứa các cặp khóa/giá trị để tạo một người đăng ký mới trong API MailChimp của tôi.băm ruby ​​thêm khóa/giá trị nếu sửa đổi

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

Rõ ràng, tôi nhận được một lỗi cú pháp của syntax error, unexpected modifier_if ... Tôi về cơ bản chỉ muốn thêm mmerge1 dựa trên điều kiện là đúng.

Trả lời

11

Bạn không thể sử dụng if theo cách đó, bên trong khối khởi tạo băm. Bạn sẽ phải có điều kiện thêm khóa/giá trị mới sau khi khởi băm:

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

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

Cảm ơn sự giúp đỡ! – 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

'hợp nhất! 'Đang thêm rất nhiều phức tạp không cần thiết cho một khóa/giá trị. – meagar

+1

Mặt khác, 'merge! 'Rất hữu ích khi thêm * nhiều * giá trị. – tadman

0

Nếu mmerge1 được phép có nil hoặc một chuỗi rỗng, bạn có thể sử dụng toán tử ternary ?: bên trong băm:

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

Bạn có thể làm cho nó 'nil' và gọi' compact', hoặc làm 'từ chối (&: blank?)'. –

+0

Nhiều phương pháp sẽ giải thích * sự hiện diện * của một khóa như thiết lập tùy chọn đó vì vậy đây không phải là một mô hình tốt để sử dụng trong thực hành chung. – tadman

0

Nếu bạn sử dụng biểu thức có điều kiện trên khóa, bạn sẽ nhận được cú pháp có thể đọc hợp lý và, nhiều nhất, chỉ cần xóa 1 phần tử khỏi 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 
Các vấn đề liên quan