从路由中访问Sinatra中的helper模块类



我正在编写一个模块化的Sinatra应用程序。我已经编写了一个帮助模块来处理oauth调用。

现在我使用一个全局变量(例如$squick ||= Skroutz::Query.new)来创建对象,它通过我的路由共享(见这里)。

然后J. Hass提到我应该避免使用全局变量,因为它不是线程安全的,他可能是对的。

然而,我不知道如何创建这个类的实例,通过我所有的路由访问。我试过几种方法,但都没用。我相信可以通过多种方式做到这一点。

感谢

p。请描述,这对我理解我在做什么很重要:-)

根据: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

如果您在浏览器中输入以下url:

http://localhost:4567/

…然后在浏览器中输入以下url:

http://localhost:4567/val

…然后检查服务器窗口中输出的id,它将与web页面显示的id相同。

然而,我不知道设置对象是否线程安全。根据Sinatra README:

请求/实例范围

对于每个传入请求,一个应用程序类的新实例

但是上面的结果显示第二个请求能够访问与第一个请求相同的Dog对象,这意味着第二个请求可以更改第一个请求看到的Dog对象。是否一个请求可以改变Dog对象的同时,另一个请求正在读取Dog对象从文档或我的谷歌搜索是不清楚的。

最新更新