【发布时间】:2011-05-30 08:32:46
【问题描述】:
在 Sinatra 中,我无法创建在应用程序生命周期中只赋值一次的全局变量。我错过了什么吗?我的简化代码如下所示:
require 'rubygems' if RUBY_VERSION < "1.9"
require 'sinatra/base'
class WebApp < Sinatra::Base
@a = 1
before do
@b = 2
end
get '/' do
puts @a, @b
"#{@a}, #{@b}"
end
end
WebApp.run!
这会导致
nil
2
在终端中,,2 在浏览器中。
如果我尝试将 @a = 1 放入 initialize 方法中,我会在 WebApp.run! 行中收到错误消息。
我觉得我错过了一些东西,因为如果我不能拥有全局变量,那么我如何在应用程序实例化期间加载大数据?
before do 似乎在每次有来自客户端的请求时都会被调用。
【问题讨论】:
-
@a不起作用的原因是get块在WebApp类的实例的上下文中运行,而您在类的上下文中设置它。它就像任何实例变量一样。如果您将其更改为@@a它应该可以工作(但有更好的方法,请参阅下面的答案)。 -
抱歉延迟回复。所以,你的意思是,每个
http get创建一个WebApp 的实例。这解释了很多。谢谢。
标签: ruby web-applications sinatra