我正在使用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
语句移到课堂内,但这并没有奏效。
有没有办法可以告诉它这不是当前框架的一部分,或者我应该处理这种情况的另一种方式?
答案 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处于经典模式,因此只有在加载完所有内容后才启动服务器。