Sinatra方法`开发?`undefined

时间:2015-01-16 19:24:16

标签: ruby sinatra

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

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

这是我得到的错误:

undefined method `development?' for main:Object (NoMethodError)

这是触发错误的代码:

require 'dm-sqlite-adapter' if development?

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

1 个答案:

答案 0 :(得分:3)

我也在努力解决这个问题。这是我在此过程中发现的。

你需要"内部"继承自Sinatra :: Base的类(例如继承自Base的Sinatra :: Application),以便能够使用base.rb中定义的development?方法。

在经典的Sinatra应用程序中,您已编码"内部"一个继承自Sinatra :: Base的类。因此,development?只会在任何地方工作"。

在模块化的Sinatra中,development?仅适用于Sinatra :: Base子类,例如:

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 :: Base的ApplicationController类,并在这里检查development?。从ApplicationController类继承的子类也是如此:

class UserController < ApplicationController
  require 'dotenv' if development?
  ...
end

对于模块化Sinatra,在(主要:对象)代码文本&#34;外部&#34; Sinatra :: Base子类,您需要遵循Arup's指令:

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