2013-01-19 30 views
0

我不想在这里复制整个代码,因为它的体积相当大,但这里是它的要点是:不断被覆盖在红宝石/请求西纳特拉

require 'sinatra' 

SOME_DATA = get_hashes_from_db 

get '/' do 

# SOME_DATA's hashes are filtered using .delete 
result = process_data SOME_DATA, request 

response.body(JSON.generate(result)) 
end 

每个请求,散列的列表进行过滤基于请求中发送的一些参数。 SOME_DATA中有一些字段用于这个过滤器,但是当它们被使用.delete擦除整个密钥时,它们被剥离。例如:

过滤前:

{'condition' => 'rainy', 'data' => 'get an umbrella!'} 

过滤后:

{'data' => 'get an umbrella!'} 

现在的问题:即使则传递到功能后,进行切割并重新分配了十几次原来不变,称已从原始STILL重新分配的变量上的.delete方法会影响原始数据。根据要求1我会说,10个哈希,每个10个字段。根据要求2我会有10个哈希,但每个有2-5个字段。

我想我有same issue as this guy,但我已经尝试将它传递给.clone希望它可以解决问题,但它没有。

我以前遇到过这个问题,但我不认为我解决过它。即使(在上面的伪代码中)我为什么仍然覆盖原来的SOME_DATA.cloneprocess_data

+0

我不能重新创建这个问题,我认为你必须提供更多的代码,但是@ zed_0xff的建议是一个很好的建议,因为它有助于追踪发生变化的位置。我还建议[Pry](https://github.com/pry/pry)进入代码并看看它正在运行。 – iain

回答

1

尝试这样的事:

SOME_DATA = get_hashes_from_db.freeze 

现在当一些代码试图修改SOME_DATA

此外,如果get_hashes_from_db返回一个数组或哈希,那么你就需要freeze每个数组会引发异常/散列元素。

相关问题