2011-12-23 10 views

risposta

4

congettura non ho mai postato la mia soluzione per questo ... Qui si va,

# 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

Questo non riuscirà a dividere correttamente i campi se hai dei dati che contengono un ',' o '=>'. '{: text =>" Benvenuto, amici. ", delim =>" => "}' – Matt

10

Il metodo più semplice e unsafest sarebbe quello di valutare solo la stringa:

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

Sto ottenendo questi in rail post params. Non c'è un modo sicuro per convertire le stringhe in hash diversi da eval. – zoras

+1

Non conosco il tuo setup, ma forse sarebbe più facile recuperare un hash in primo luogo. Altrimenti, ruby ​​supporta alcuni livelli di TAINT, vedi: http://www.ruby-doc.org/docs/ProgrammingRuby/html/taint.html – miku

17

Il modo suggerito nella risposta di Miku è infatti più semplice e unsafest.

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

Considerare l'utilizzo di una rappresentazione di stringa diversa degli hash, ad es. JSON o YAML. È molto più sicuro e almeno altrettanto robusto.

+1

nop questi sono rails post param quindi suppongo di non poter usare json o yaml – zoras

+1

Perché sono in una stringa? –

+1

Interessante. I controller in Rails solitamente ricevono i parametri 'POST' come oggetti Ruby. Come mai li prendi come una stringa? – Jan

14

Con un po 'di sostituzione, è possibile utilizzare YAML:

require 'yaml' 

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

Ma questo funziona solo per questa specifica, semplice stringa. A seconda dei tuoi dati reali potresti avere problemi.

+0

Ha funzionato come un incantesimo! Ho passato il mio in 'HashWithIndifferentAccess.new' per ottenere un hash come l'hash param. – Josh

+0

MIGLIORE RISPONDE COSI 'LONTANO, grazie! – sidney

10

se il vostro hash stringa è una sorta di come questo (che può essere nidificato o hash pianura)

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

è possibile convertire in hash come questo senza usare eval che è pericoloso

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

e per quello che hai postato w qui la chiave è un simbolo si può usare come questo

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

Gli hash contengono 'null' per oggetti nulli, dove questo contiene 'nil', quindi anche questo dovrebbe essere sostituito. –

Problemi correlati