2011-12-23 13 views

Respuesta

4

Guess nunca ha escrito mi solución para este ... Aquí 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

Esto no podrá dividir los campos correctamente si tiene algún dato que contenga un ',' o '=>'. '{: text =>" Bienvenido, amigos. ", delim =>" => "}' – Matt

10

La forma más fácil y unsafest sería evaluar sólo la cadena:

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

Estoy obteniendo estos en rails post params. ¿No hay una forma segura de convertir cadena en hash que no sea eval? – zoras

+1

No conozco su configuración, pero tal vez sería más fácil obtener un hash en primer lugar. De lo contrario, ruby ​​admite algunos niveles de TAINT, consulte: http://www.ruby-doc.org/docs/ProgrammingRuby/html/taint.html – miku

17

La forma sugerida en la respuesta de miku es de hecho más fácil y unsafest.

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

Considere utilizar una representación de cadena diferente de sus valores hash, p. JSON o YAML. Es mucho más seguro y al menos igualmente robusto.

+1

nop, estos son rieles posteriores a los parametros, así que supongo que no puedo usar json o yaml – zoras

+1

¿Por qué están en una cuerda? –

+1

Interesante. Los controladores en Rails generalmente reciben params 'POST' como objetos Ruby. ¿Cómo puedes obtenerlos como una cadena? – Jan

14

Con un poco de reemplazo, puede usar YAML:

require 'yaml' 

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

Pero esto sólo funciona para esta cadena específica, sencilla. Dependiendo de sus datos reales, puede tener problemas.

+0

¡Funcionó como un amuleto! Pasé el mío en 'HashWithIndifferentAccess.new' para obtener un hash como el param hash. – Josh

+0

MEJOR RESPUESTA HASTA AHORA, gracias! – sidney

10

si su cadena de hash es una especie de como esta (que se puede anidar o hash de llanura)

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

se puede convertir en picadillo como esto sin usar eval lo cual es peligroso

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

y para el uno informados w Aquí la clave es un símbolo puede utilizar como esto

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

Los hashes contienen 'nulo' para objetos nulos, mientras que este contiene 'nil', por lo que también tendría que ser reemplazado. –

Cuestiones relacionadas