2015-01-16 18 views
5

Doktorzy Sinatra mówią, że development? zwróci wartość true, gdy środowisko się rozwija, ale pojawia się błąd stwierdzający, że metoda development? jest niezdefiniowana.Metoda sinatry `rozwój?` Undefined

Próbowałem pomijając skrót i testując samą zmienną ENV['RAKE_ENV'], ale była ona po prostu zerowa.

Jest to błąd Dostaję:

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

i jest to kod, który jest wyzwalanie błąd:

require 'dm-sqlite-adapter' if development? 

Używam modułową aplikację stylu. Powyższa linia to osobny plik, który zarządza tylko modelem. Co się dzieje?

+1

Co się stanie, jeśli użyjesz go jako symbolu (ze znakiem dwukropka) wymaga "xyz", jeśli: development? –

+0

Naprawiono. Wielkie dzięki. Jeśli chcesz wyrazić to jako odpowiedź, chętnie zaakceptuję to jako poprawne. Jaka jest różnica między składnią symboliczną a nie symboliczną? Skąd mam wiedzieć, kiedy użyć? –

+2

@EmanueleFeliziani to nie jest poprawka '... if: any_symbol_whatsoever' zawsze zwróci true, ponieważ symbol nie jest' nil' ani 'false'. – matt

Odpowiedz

3

Ja też walczyłem z tym. Oto, co odkryłem po drodze.

Musisz być "wewnątrz" klasy, która dziedziczy po Sinatrze :: Base (takiej jak Sinatra :: Application, która dziedziczy po Base), aby móc korzystać z metody development?, która jest zdefiniowana w base.rb.

W klasycznej aplikacji Sinatra już kodujesz "w środku" klasę, która dziedziczy po Sinatrze :: Base. Tak więc development? będzie działać "w dowolnym miejscu".

W modułowej Sinatra development? będzie działać tylko w Sinatra :: Base podklasy, takie jak:

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 

Więc w zasadzie można użyć klasy ApplicationController która dziedziczy Sinatra :: Base, a wewnątrz tutaj Zobacz dla development?. To samo odnosi się do podklasy, która dziedziczy z klasy ApplicationController:

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

Dla modułowej Sinatra, w (main: Object) tekst kodu „na zewnątrz” Sinatra :: Base podklasy, trzeba wykonać Arup's instrukcje:

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

Ponieważ używasz modułowy styl, trzeba dodać moduł przestrzeni nazw Sinatra::Base przed metody.

Dzięki temu będziesz mieć dostęp do Sinatra::Base.development? w dowolnym miejscu aplikacji.