【问题标题】:Sinatra seemingly expecting that class should be a part of current frameworkSinatra 似乎期望该类应该成为当前框架的一部分
【发布时间】:2016-05-29 10:32:00
【问题描述】:

我正在使用 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 语句移到类内部,但没有奏效。

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

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:

    当您调用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 处于经典模式,因此服务器仅在加载完所有内容后启动。

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 2018-04-16
      相关资源
      最近更新 更多