我正在编写模块化Sinatra应用程序。我写了一个helper module来处理oauth电话。
现在我使用global variable(例如$squick ||= Skroutz::Query.new
)来创建对象,该对象通过我的路线共享(请参阅here)。
然后J. Hass提到我应该避免使用全局变量,因为它不是线程安全的,他可能是对的。
但是,我不知道如何创建这个类的实例,可以通过我的所有路径访问。我尝试了几件事,但没有任何效果。我确信它可以通过多种方式完成。
由于
PS。请描述一下,了解我正在做的事情对我来说很重要: - )
答案 0 :(得分:1)
根据:http://www.sinatrarb.com/configuration.html,您可以这样做:
require 'sinatra/base'
module Animals
class Dog
end
end
class MyApp < Sinatra::Base
set :dog, Animals::Dog.new
get '/' do
puts "The object_id in '/' is: #{settings.dog.object_id}"
end
get '/val' do
"The object_id in '/val' is: #{settings.dog.object_id}"
end
run! if app_file == $0
end
如果您在浏览器中输入以下网址:
http://localhost:4567/
...然后在浏览器中输入此网址:
http://localhost:4567/val
...然后检查在服务器窗口中输出的id,它将与网页上显示的id相同。
但是,我不知道设置对象是否是线程安全的。根据Sinatra自述文件:
请求/实例范围
对于每个传入请求,应用程序类的新实例 已创建,并且所有处理程序块都在该范围内运行。
但上面的结果显示第二个请求能够访问与第一个请求相同的Dog对象,这意味着第二个请求可以更改第一个请求看到的Dog对象。一个请求是否可以在另一个请求正在读取Dog对象的同时更改Dog对象,这在文档或我的Google搜索中是不明确的。