2011-10-03 11 views
5

que estoy recibiendo una respuesta en el formato de¿Mejor forma de convertir varias variables de instancia en hash con ruby?

#<Response:0x000... @first = "Charlie", @last=Kelly, .... 

y tengo que convertir esto en un hash (por comerciante activo). Actualmente estoy bucle a través de las variables y hacer esto:

response.instance_variables.each do |r| 
    my_hash.merge!(r.to_s.delete("@").intern => response.instance_eval(r.to_s.delete("@"))) 
end 

Esto funciona, producirá {:first = "charlie", :last => "kelly"} , pero parece un poco hacky e inestable. Hay una mejor manera de hacer esto ?

editar: Me acabo de dar cuenta de que puedo usar instance_variable_get para la segunda parte de esa ecuación, pero eso aún deja el problema principal.

Respuesta

9

Rails tiene un método en Object llamado por solo esto. Aquí está el code on GitHub.

class C 
    def initialize(x, y) 
    @x, @y = x, y 
    end 
end 

C.new(0, 1).instance_values # => {"x" => 0, "y" => 1} 
C.new(0, 1).instance_values.symbolize_keys # => {:x => 0, :y => 1} 
+0

¿Hay alguna manera de forzar el primer valor en un símbolo en lugar de una cadena? No puedo tocar el código que está recibiendo esto, y las cadenas no funcionan. – cbron

+0

Claro, '.symbolize_keys':' obj.instance_values.symbolize_keys' debería ayudarte! –

+0

Aww hombre perfecto. Empecé a volver a escribir ese método de valores_instancia, pero esto es mucho más fácil. Grazie. – cbron

Cuestiones relacionadas