2015-01-16 16 views
5

Die Sinatra-Dokumente sagen, dass development? wird True zurückgegeben, wenn die Umgebung Entwicklung ist, aber ich erhalte einen Fehler, der besagt, dass die Methode development? nicht definiert ist.Sinatra-Methode `Entwicklung?` Undefined

Ich versuchte, die Kurzschrift zu überspringen und die ENV['RAKE_ENV'] Variable selbst zu testen, aber es war einfach null.

Dies ist der Fehler Ich erhalte:

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

und dies ist der Code, der den Fehler auslöst:

require 'dm-sqlite-adapter' if development? 

ich verwende den modularen Stil App. Die obige Zeile ist eine separate Datei, die nur das Modell verwaltet. Was ist los?

+1

Was passiert, wenn Sie es als ein Symbol verwenden (mit einem Doppelpunkt), benötigen Sie "xyz" wenn: Entwicklung? –

+0

Es wurde behoben. Danke vielmals. Wenn Sie es als Antwort geben wollen, werde ich es gerne als korrekt akzeptieren. Was ist der Unterschied zwischen Symbol- und Nicht-Symbol-Syntax? Woher weiß ich, wann ich welche verwenden soll? –

+2

@EmanueleFeliziani das ist kein Fix '... wenn: any_symbol_whatsoever 'wird immer wahr zurückgegeben, da ein Symbol nicht' nil 'oder' false 'ist. – matt

Antwort

3

Ich kämpfte auch mit diesem. Hier ist, was ich auf dem Weg entdeckt habe.

Sie müssen "innerhalb" einer Klasse sein, die von Sinatra :: Base erbt (z. B. Sinatra :: Application, die von Base erbt), um die in base.rb definierte Methode development? verwenden zu können.

In einer klassischen Sinatra-App codieren Sie bereits "inside" eine Klasse, die von Sinatra :: Base erbt. So wird development? einfach "überall" funktionieren.

In modularen Sinatra die development? nur in Sinatra arbeitet :: Base Unterklassen, wie zum Beispiel:

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 

Also im Grunde können Sie eine Application Klasse, die von Sinatra :: Base erbt und innen hier überprüfen für development?. Das gleiche gilt für Unterklassen, die von Ihrem Application Klasse erbt:

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

Für modulare Sinatra, in dem (Haupt-: Object) Code Text „außerhalb“ Sinatra :: Base Unterklassen, müssen Sie Arup's folgen Anleitung:

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

Da Sie den modularen Stil verwenden, müssen Sie das Modul Namensraum Sinatra::Base vor dem Verfahren hinzuzufügen.

So können Sie auf Sinatra::Base.development? überall in der App zugreifen.