Ruby 为什么我不能设置此哈希键的值? task={:project=>1000, :顺序=>0, :部分图像=>nil, :选项=>{ :高度=>50, :宽度=>50, :start_row=>1, :开始列=>1, :end_行=>50, :end_列=>50, :scene=>0} project=redis.hget('active_projects',task[:project]) => {:name=>“Pov”, :任务=> {0=> {:project=>1000, :顺序=>0, :部分图像=>nil, :选项=> {:高度=>50, :宽度=>50, :start_row=>1, :开始列=>1, :end_行=>50, :end_列=>50, :scene=>“blabla” } } }, :id=>1000, :image=>“”, :选项=> {:高度=>100, :宽度=>50, :scene=>“blabla” } } 任务[:partial_image]=“blabla” 项目[:任务][任务[:顺序]]=任务#这是第37行 失败/错误:已完成任务=DPovray::task.perform(任务) 类型错误: 无法将符号转换为整数 #./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层)in'
密码在里面Ruby 为什么我不能设置此哈希键的值? task={:project=>1000, :顺序=>0, :部分图像=>nil, :选项=>{ :高度=>50, :宽度=>50, :start_row=>1, :开始列=>1, :end_行=>50, :end_列=>50, :scene=>0} project=redis.hget('active_projects',task[:project]) => {:name=>“Pov”, :任务=> {0=> {:project=>1000, :顺序=>0, :部分图像=>nil, :选项=> {:高度=>50, :宽度=>50, :start_row=>1, :开始列=>1, :end_行=>50, :end_列=>50, :scene=>“blabla” } } }, :id=>1000, :image=>“”, :选项=> {:高度=>100, :宽度=>50, :scene=>“blabla” } } 任务[:partial_image]=“blabla” 项目[:任务][任务[:顺序]]=任务#这是第37行 失败/错误:已完成任务=DPovray::task.perform(任务) 类型错误: 无法将符号转换为整数 #./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层)in',ruby,Ruby,密码在里面 失败的测试可以使用rspec spec/task\u spec.rb运行。实际上project=redis.hget('active\u projects',task[:project])返回的是字符串,而不是ruby哈希。这就是它失败的原因 我在玩,看我能不能做我想做的事 此外,与其做: task = {:project=>1000, :order=>0, :partial_image=>nil, :optio
失败的测试可以使用
rspec spec/task\u spec.rb运行。实际上project=redis.hget('active\u projects',task[:project])
返回的是字符串,而不是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)>'
你可以做:
Redis.new.hset('active_projects', active_project[:id], active_project)
多亏了散列编组,它才起作用
但是,我不认为这是一个好的解决办法。我不喜欢使用封送处理,因为通过查看数据库进行调试非常困难
而且我刚刚得到一个:
Redis.new.hset('active_projects', active_project[:id], Marshal.dump(active_project))
因此,让我们发现一种不同的方法
编辑:
现在我正在使用JSON.dump和JSON.parse。它们似乎是更好的方法
编辑:
我最终把这个散列封装成了一个真实的对象。所以我有项目类和任务类。在每一种方法中,我都定义了方法to_json
和self.json_create(o)
,它们可以转换为json或从json转换而来
它运行得很好。您确定项目看起来像您所说的那样吗?你能发布一个实际的可运行的示例来重现错误吗?@sepp2k:当然,在上签出代码并运行rspec spec/task_spec。rb@sepp2k:这是一个非常奇怪的错误。1.30小时,我还不知道到底是怎么回事。试着显示project[:tasks]
和task[:order]
@sawa:puts project[:tasks]给我的是不能将符号转换成整数的#/lib/jobs/job.rb:37:in`[]'
incompatible marshal file format (can't be read)
format version 4.8 required; 123.58 given