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 :(得分: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_json
和self.json_create(o)
定义为可以转换为JSON的方法。
效果很好。