In Sinatra(Ruby), how should I create global variables which are assigned values only once in the application lifetime?
class WebApp < Sinatra::Base configure do set :my_config_property, 'hello world' end get '/' do "#{settings.my_config_property}" endend
Beware that if you use Shotgun, or some other Rack runner tool that reloads the code on each request the value will be recreated each time and it will look as if it's not assigned only once. Run in production mode to disable reloading and you will see that it's only assigned on the first request (you can do this with for example rackup --env production config.ru
).
I ran into a similar issue, I was trying to initialize an instance variable @a
using the initialize
method but kept receiving an exception every time:
class MyApp < Sinatra::Application def initialize @a = 1 end get '/' do puts @a 'inside get' endend
I finally decided to look into the Sinatra code for initialize:
# File 'lib/sinatra/base.rb', line 877def initialize(app = nil) super() @app = app @template_cache = Tilt::Cache.new yield self if block_given?end
Looks like it does some necessary bootstrapping and I needed to call super()
.
def initialize super() @a = 1 end
This seemed to fix my issue and everything worked as expected.