Sinatra全局应用程序变量

时间:2012-05-31 21:27:12

标签: ruby sinatra

我有一个简单的Sinatra应用程序,我想在所有会话和请求中共享变量。

configure do
  @@click_count = 0
end

def send_message(text)
  # ignore, this part works
end

post '/click' do
  @@click_count = @@click_count + 1
  send_message "clicks: #{@@click_count}"
end

发送的邮件总是clicks: 1而不是递增。我还尝试了set :click_count, 0然后settings.click_count = settings.click_count + 1,但我仍然得到同样的结果。< / p>

我正在使用shotgun web.rb -p 4567 -E production使用霰弹枪在本地运行服务器,因为在非生产环境中提到的另一个问题是服务器在每个丢失状态的请求上重新启动。

任何想法如何让这个工作?

2 个答案:

答案 0 :(得分:5)

Sinatra本身不会在开发模式(it used to)中的每个请求上重新启动,但shotgun会产生这种影响:

  

每次收到请求时,它都会分叉,加载应用程序   子进程,处理请求,退出子进程。

只需使用ruby web.rb,一切都应该有效(模块化的线程问题,你发表评论看起来就像你知道的那样)。

答案 1 :(得分:2)

我不确定configure块的运行频率。尝试使用全局变量(例如$click_count)而不是类实例变量,并在任何块之外的程序的最顶层初始化它。