从路由访问Sinatra中的辅助模块类

时间:2014-08-22 17:12:18

标签: ruby sinatra

我正在编写模块化Sinatra应用程序。我写了一个helper module来处理oauth电话。

现在我使用global variable(例如$squick ||= Skroutz::Query.new)来创建对象,该对象通过我的路线共享(请参阅here)。

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

但是,我不知道如何创建这个类的实例,可以通过我的所有路径访问。我尝试了几件事,但没有任何效果。我确信它可以通过多种方式完成。

由于

PS。请描述一下,了解我正在做的事情对我来说很重要: - )

1 个答案:

答案 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搜索中是不明确的。