Ruby Sinatra方法`开发?`未定义

Ruby Sinatra方法`开发?`未定义,ruby,sinatra,Ruby,Sinatra,Sinatra文档说,当环境正在开发时,development?将返回true,但我收到一个错误,指出方法development?未定义 我尝试跳过速记并测试ENV['RAKE_ENV']变量本身,但结果是零 这就是我得到的错误: undefined method `development?' for main:Object (NoMethodError) 这是触发错误的代码: require 'dm-sqlite-adapter' if development? 我正在使用模块化风格的应用

Sinatra文档说,当环境正在开发时,
development?
将返回true,但我收到一个错误,指出方法
development?
未定义

我尝试跳过速记并测试
ENV['RAKE_ENV']
变量本身,但结果是零

这就是我得到的错误:

undefined method `development?' for main:Object (NoMethodError)
这是触发错误的代码:

require 'dm-sqlite-adapter' if development?

我正在使用模块化风格的应用程序。上面的一行是一个单独的文件,仅管理模型。发生了什么事?

我也在为这件事挣扎。这是我一路上发现的

您需要“在”从Sinatra::Base继承的类中(例如,从Base继承的Sinatra::Application),才能使用中定义的
开发?
方法

在经典的Sinatra应用程序中,您已经在继承自Sinatra::Base的类的“内部”编码了。所以
开发?
在“任何地方”都可以工作

在模块化Sinatra中,
开发?
将只在Sinatra::基子类中工作,例如:

require 'sinatra/base'

# Placing
# require 'dm-sqlite-adapter' if development?
# here will not work.

class ApplicationController < Sinatra::Base
require 'dm-sqlite-adapter' if development? # But here it works
...
end

# Placing 
# require 'dm-sqlite-adapter' if development?` 
# AFTER the above class will still not work

class SomethingElse 
# nor will `development?` work here, since it is called inside
# a class without Sinatra::Base inheritance
...
end
对于模块化Sinatra,在(main:Object)代码文本“outside”Sinatra::Base子类中,您需要遵循以下说明:

if Sinatra::Base.environment == :development
    require 'awesome_print'
    require 'dotenv'
    Dotenv.load
    ...
end

由于您使用的是模块化样式,因此需要在方法之前添加模块名称空间
Sinatra::Base


因此,您将能够访问应用程序中的任何位置。Sinatra::Base.development?。非常感谢。如果你想把它作为一个答案,我很乐意接受它的正确性。符号和非符号语法之间有什么区别?我怎么知道什么时候使用它?@EmanueleFeliziani这不是一个补丁
。。。if:any_symbol无论什么
都将始终返回true,因为符号不是
nil
false
。是@matt,你是对的。如果Sinatra::Base.environment==:development可以解决此问题,那么需要“dm sqlite adapter”,以了解可能导致此问题的原因。
if Sinatra::Base.environment == :development
    require 'awesome_print'
    require 'dotenv'
    Dotenv.load
    ...
end