¿Por qué no puedo establecer el valor de esta clave hash?

task = {:project=>1000, 
        :order=>0, 
        :partial_image=>nil, 
        :options=>{
           :height=>50, 
           :width=>50, 
           :start_row=>1, 
           :start_column=>1, 
           :end_row=>50, 
           :end_column=>50, 
           :scene=>0}}

project = redis.hget('active_projects', task[:project])        
=> 
{:name=>"Pov", 
 :tasks=>
        {0=>
            {:project=>1000, 
             :order=>0, 
             :partial_image=>nil, 
             :options=>
                 {:height=>50, 
                  :width=>50, 
                  :start_row=>1, 
                  :start_column=>1, 
                  :end_row=>50, 
                  :end_column=>50, 
                  :scene=>"blabla"
                 }
             }
         }, 
  :id=>1000,
  :image=>"", 
  :options=>
        {:height=>100, 
         :width=>50,  
         :scene=>"blabla"
        }
   }

task[:partial_image] = 'blablabla'    
project[:tasks][task[:order]] = task    # this is line 37

 Failure/Error: completed_task = DPovray::Task.perform(task)
 TypeError:
   can't convert Symbol into Integer
 # ./lib/jobs/job.rb:37:in `[]'
 # ./lib/jobs/job.rb:37:in `block in perform'
 # ./lib/jobs/job.rb:35:in `perform'
 # ./spec/task_spec.rb:22:in `block (4 levels) in <top (required)>'

El código está en https://github.com/Nerian/DPovray

La prueba que falla se puede ejecutar con rspec spec/task_spec.rb

preguntado el 16 de mayo de 11 a las 19:05

¿Estás seguro de que los proyectos se parecen a lo que dices? ¿Puede publicar un ejemplo ejecutable real que reproduzca el error? -

@ sepp2k: Claro, revisa el código en github.com/Nerian/DPovray y ejecute rspec spec / task_spec.rb -

@ sepp2k: es un error muy extraño. 1.30 hy no me he imaginado qué diablos está mal. -

Tratar de mostrar project[:tasks] y task[:order]. -

@sawa: pone el proyecto [: tasks] me da no puedo convertir el símbolo en entero # ./lib/jobs/job.rb:37:in `[] '-

1 Respuestas

Actualmente project = redis.hget('active_projects', task[:project]) devuelve una cadena, no un hash ruby. Por eso falla.

Estoy jugando con https://github.com/nateware/redis-objects para ver si puedo hacer lo que quiero hacer.

Además, en lugar de hacer:

Redis.new.hset('active_projects', active_project[:id], active_project)

Tu puedes hacer:

Redis.new.hset('active_projects', active_project[:id], Marshal.dump(active_project))

Y simplemente funciona, gracias al cálculo de hash.

No obstante, no considero que esta sea una buena solución. No me gusta usar Marshaling ya que es muy difícil depurar mirando la base de datos.

Además, acabo de recibir un:

 incompatible marshal file format (can't be read)
    format version 4.8 required; 123.58 given

Así que descubramos un enfoque diferente ...

editar:

Ahora estoy jugando con JSON.dump y JSON.parse. Parecen un mejor enfoque.

Edit:

Terminé encapsulando este hash en un objeto real. Entonces tengo una clase de Proyecto y una clase de Tarea. En cada uno defino los métodos to_json y self.json_create(o) para que se puedan convertir desde y hacia JSON.

Funciona bastante bien.

contestado el 20 de mayo de 11 a las 00:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.