2015-01-16 18 views
5

I documenti di Sinatra dicono che development? restituiranno true quando l'ambiente è in sviluppo, ma ricevo un errore che indica che il metodo development? non è definito.metodo `Sinatra` sviluppo?` Undefined

Ho provato saltando l'abbreviazione e testare variabile ENV['RAKE_ENV'] stessa, ma era solo zero.

Questo è l'errore che sto ricevendo:

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

e questo è il codice che sta provocando l'errore:

require 'dm-sqlite-adapter' if development? 

Sto usando lo stile app modulare. La riga sopra è un file separato che gestisce solo il modello. Cosa sta succedendo?

+1

Cosa succede se lo si utilizza come simbolo (con un carattere di due punti) richiede "xyz" se: sviluppo? –

+0

risolto. Grazie molto. Se vuoi metterlo come risposta, sarò felice di accettarlo come corretto. Qual è la differenza tra sintassi simbolo e non simbolo? Come faccio a sapere quando usare quale? –

+2

@EmanueleFeliziani che non è una correzione '... if: any_symbol_whatsoever' restituirà sempre true, in quanto un simbolo non è' nil' o 'false'. – matt

risposta

3

ho lottato con questo, anche. Ecco cosa ho scoperto lungo la strada.

Devi essere "dentro" una classe che eredita da Sinatra :: Base (come Sinatra :: Application, che eredita da Base) per essere in grado di utilizzare il metodo development?, che è definito in base.rb.

In un classico Sinatra app che già la codifica "dentro" una classe che eredita da Sinatra :: Base. Quindi development? funzionerà "ovunque".

Nel Sinatra modulare la development? funzionerà solo in Sinatra :: Base sottoclassi, come ad esempio:

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 

Quindi, in pratica è possibile utilizzare una classe che eredita da ApplicationController Sinatra :: Base e qui dentro controllare per development?. Lo stesso vale per le sottoclassi che eredita dalla classe ApplicationController:

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

Per Sinatra modulare, nella (principale: Object) testo del codice "fuori" Sinatra :: Base sottoclassi, è necessario seguire Arup's istruzioni:

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

Dal momento che si sta utilizzando lo stile modulare, è necessario aggiungere il modulo namespace Sinatra::Base prima del metodo.

Così sarete in grado di accedere Sinatra::Base.development? qualsiasi schermata dell'app.