我可以在 Sinatra (Ruby) 中创建跨路由工作的全局变量吗?

Can I create global variables that work accross routes in Sinatra (Ruby)?

我正在尝试让 ruby class 管理我的应用程序中发生的大部分事情,我打算通过带有嵌入式 Ruby 代码的 erb 来管理它的参数.我想象它是这样的,但它显然不起作用:

    require 'sinatra'
    require './models/questionaire_manager'

    set :bind, '0.0.0.0'
    set :port, ENV['PORT']
    enable :sessions
    set :session_secret, 'SecretString#!$%'




    get '/' do
        @questionaire=Questionaire_Manager.new 0
        erb :index
    end

    post '/' do
        session[:number]=params[:number] 
        redirect '/quiz'
    end

    get '/quiz' do
        @questionaire.number=session[:number]
        @questionaire.genQuestionaire
        erb :quiz
    end

    post '/quiz' do
        redirect'/results'
    end

    get '/results' do
        @number=session[:number]
        erb :results
    end

我想我还应该说我无法掌握会话和会话参数的窍门,而且由于 Sinatra 的页面已经关闭将近一个星期了,我真的无法查看它。

也许试试这样的东西?

require 'sinatra'
require './models/questionaire_manager'

set :bind, '0.0.0.0'
set :port, ENV['PORT']
enable :sessions
set :session_secret, 'SecretString#!$%'

helpers do
  def quiz_manager
    @questionaire = session[:quiz_manager] ||= Questionaire_Manager.new 0
  end
end

get '/' do
  # Uncomment the line below if you intend to create a new quiz each time
  # session[:quiz_manager] = nil
  quiz_manager   # Initializes the session variable
  erb :index
end

post '/' do
  quiz_manager.number = params[:number]
  redirect '/quiz'
end

get '/quiz' do
  quiz_manager.genQuestionaire
  erb :quiz
end

post '/quiz' do
  redirect '/results'
end

get '/results' do
  @number = quiz_manager.number
  erb :results
end

编辑:

为了阐明这是在做什么——我创建了一个名为 quiz_manager 的辅助方法,如果尚未设置它,它会初始化 session[:quiz_manager]——这将在路由之间持续存在。我还设置了 class 变量 @questionnaire 以便您可以在您的视图中访问它。