2011-12-23 30 views

Trả lời

4

Guess Tôi chưa bao giờ đăng tải workaround của tôi cho điều này ... Ở đây nó đi,

# strip the hash down 
stringy_hash = "account_id=>4444, deposit_id=>3333" 

# turn string into hash 
Hash[stringy_hash.split(",").collect{|x| x.strip.split("=>")}] 
+3

Điều này sẽ không chia tách các trường một cách chính xác nếu bạn có bất kỳ dữ liệu nào chứa một ',' hoặc '=>'. '{: text =>" Chào mừng, bạn bè. ", delim =>" => "}' – Matt

10

Các dễ nhất và unsafest sẽ chỉ đánh giá chuỗi:

>> s = "{:account_id=>4444, :deposit_id=>3333}" 
>> h = eval(s) 
=> {:account_id=>4444, :deposit_id=>3333} 
>> h.class 
=> Hash 
+0

Tôi nhận được các thông số này trong đường ray. Không có cách nào an toàn để chuyển đổi chuỗi thành băm khác với eval. – zoras

+1

Tôi không biết thiết lập của bạn, nhưng có lẽ sẽ dễ dàng hơn khi lấy lại một băm ngay từ đầu. Nếu không, ruby ​​hỗ trợ một số mức TAINT, xem: http://www.ruby-doc.org/docs/ProgrammingRuby/html/taint.html – miku

17

Cách gợi ý trong câu trả lời của miku thực sự là đơn giản nhất và unsafest.

# DO NOT RUN IT 
eval '{:surprise => "#{system \"rm -rf/\"}"}' 
# SERIOUSLY, DON'T 

Cân nhắc việc sử dụng biểu diễn chuỗi khác nhau của băm, ví dụ: JSON hoặc YAML. Đó là cách an toàn hơn và ít nhất là mạnh mẽ như nhau.

+1

nop đây là những đường ray đăng params vì vậy tôi đoán tôi không thể sử dụng json hoặc yaml – zoras

+1

Tại sao họ trong một chuỗi? –

+1

Thú vị. Các bộ điều khiển trong Rails thường nhận các tham số 'POST' như các đối tượng Ruby. Làm thế nào đến bạn nhận được chúng như một chuỗi? – Jan

14

Với một sự thay thế chút, bạn có thể sử dụng YAML:

require 'yaml' 

p YAML.load(
    "{:account_id=>4444, :deposit_id=>3333}".gsub(/=>/, ': ') 
) 

Nhưng công trình này chỉ dành cho, chuỗi đơn giản cụ thể này. Tùy thuộc vào dữ liệu thực của bạn, bạn có thể gặp vấn đề.

+0

Làm việc như một sự quyến rũ! Tôi thông qua của tôi vào 'HashWithIndifferentAccess.new' để có được một băm như băm param. – Josh

+0

TRẢ LỜI TRẢ LỜI TỐT NHẤT, cảm ơn! – sidney

10

nếu chuỗi hash của bạn là một số loại như thế này (nó có thể được lồng vào nhau hoặc băm đơn giản)

stringify_hash = "{'account_id'=>4444, 'deposit_id'=>3333, 'nested_key'=>{'key1' => val1, 'key2' => val2}}" 

bạn có thể chuyển đổi nó sang băm như thế này mà không sử dụng eval đó là nguy hiểm

desired_hash = JSON.parse(stringify_hash.gsub("'",'"').gsub('=>',':')) 

và cho người mình gửi w đây chính là một biểu tượng, bạn có thể sử dụng như thế này

JSON.parse(string_hash.gsub(':','"').gsub('=>','":')) 
+0

Hashes chứa 'null' cho các đối tượng null, ở đây nó chứa 'nil', do đó cần phải được thay thế. –

Các vấn đề liên quan