为什么我无法设置此哈希键的值?

时间:2011-05-16 19:09:22

标签: ruby

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

运行

1 个答案:

答案 0 :(得分:1)

实际上project = redis.hget('active_projects', task[:project])返回一个字符串,而不是ruby哈希。所以这就是它失败的原因。

我正在玩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的方法。

效果很好。