在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

最佳答案

class WebApp < Sinatra::Base
  configure do
    set :my_config_property, 'hello world'
  end

  get '/' do
    "#{settings.my_config_property}"
  end
end

请注意,如果您使用Shotgun或其他一些在每个请求上重新加载代码的Rack运行器工具,则每次都会重新创建该值,并且看起来好像并非仅分配了一次。在生产模式下运行以禁用重新加载,您将看到它仅在第一个请求上分配(您可以使用rackup --env production config.ru进行此操作)。

关于ruby - 在Sinatra(Ruby)中,如何创建在应用程序生命周期中仅被分配了一次值的全局变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4525482/

10-12 18:24