2011-05-16 93 views
0
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)>' 

的代码是https://github.com/Nerian/DPovray为什么我不能设置这个散列键的值?

失败可以rspec spec/task_spec.rb

+0

你确定项目看起来像你说的吗?你能发布一个实际可运行的例子来重现错误吗? – sepp2k 2011-05-16 19:15:18

+0

@ sepp2k:当然,在https://github.com/Nerian/DPovray检查代码并运行rspec spec/task_spec.rb – Nerian 2011-05-16 19:21:53

+0

@ sepp2k:这是一个非常奇怪的错误。 1.30小时,我还没有确定到底是什么错误。 – Nerian 2011-05-16 19:35:56

回答

1

其实project = redis.hget('active_projects', task[:project])返回一个字符串,而不是红宝石哈希来运行测试。所以这就是失败的原因。

我正在玩https://github.com/nateware/redis-objects看看我是否可以做我想做的事。

此外,而不是这样做的:

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

你可以这样做:

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

,它就可以工作,这要归功于哈希编组。

尽管如此,我并不认为这是一个好的解决方案。我不喜欢使用Marshaling,因为通过查看数据库进行调试非常困难。

而且我刚刚得到一个:

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

因此,让我们发现了一个不同的方法......

编辑:

现在我玩那样json.dump和JSON.parse。他们似乎是更好的方法。

编辑:

我结束了封装该散列成一个真正的对象。所以我有Project类和一个Task类。在每一个中,我定义了方法to_jsonself.json_create(o),以便它们可以转换为JSON并从中转换。

它工作得很好。

相关问题