Sinatra似乎期望该课程应成为当前框架的一部分

时间:2016-05-29 02:14:02

标签: ruby sinatra

我正在使用Sinatra,并将此代码用于设置:

require 'sinatra/base'

class MyServer < Sinatra::Base
  def initialize()
    puts 'initialize'
    super(app)

    @my_thing = Something.new
  end

  run! if app_file == $0
end

class Something
  def initialize
    @a_thing
  end
end

当我运行ruby test.rb时,我收到此错误:

  

处理请求时出现意外错误:未初始化的常量MyServer :: Something

这表明它期望Something成为MyServer域中的一个类(我最近才开始使用Ruby,所以不知道正确的术语)。将Something类移到MyServer类内部,它可以正常工作。

这对于在此文件中编写的类很好,但我想从相对文件中添加一个类作为属性。我已经尝试将require_relative语句移到课堂内,但这并没有奏效。

有没有办法可以告诉它这不是当前框架的一部分,或者我应该处理这种情况的另一种方式?

1 个答案:

答案 0 :(得分:2)

当您调用run!时,服务器立即启动,并且仅在服务器完成时评估脚本的其余部分。在脚本中调用run!时,Something类尚未定义,因此服务器无法使用。

该行不一定需要在MyServer类中,您可以将其移动到文件的末尾,但是您需要指定接收器:

require 'sinatra/base'

class MyServer < Sinatra::Base
  # Define your app...
end

# Your helper object...
class Something
  #...
end

# Now start the server as the last thing:
MyServer.run! if MyServer.app_file == $0

Sinatra本身uses an at_exit block to start the server处于经典模式,因此只有在加载完所有内容后才启动服务器。