2012-04-05 8 views
6

Ho un app Sinatra che, bollito giù, appare sostanzialmente in questo modo:Come definire un metodo da chiamare dal blocco configure di un'applicazione sinatra modulare?

class MyApp < Sinatra::Base 

    configure :production do 
    myConfigVar = read_config_file() 
    end 

    configure :development do 
    myConfigVar = read_config_file() 
    end 

    def read_config_file() 
    # interpret a config file 
    end 

end 

Purtroppo, questo non funziona. Ottengo undefined method read_config_file for MyApp:Class (NoMethodError)

La logica in read_config_file non è banale, quindi non voglio duplicare in entrambi. Come posso definire un metodo che può essere chiamato da entrambi i miei blocchi di configurazione? O sto semplicemente affrontando questo problema in modo completamente sbagliato?

risposta

5

Sembra che il blocco configure venga eseguito mentre il file viene letto. Hai semplicemente bisogno di spostare la definizione del metodo prima del blocco di configurazione, e convertirlo in un metodo di classe:

class MyApp < Sinatra::Base 

    def self.read_config_file() 
    # interpret a config file 
    end 

    configure :production do 
    myConfigVar = self.read_config_file() 
    end 

    configure :development do 
    myConfigVar = self.read_config_file() 
    end 

end 
+0

Brillante! Che funzioni. Ora devo andare a leggere un libro rubino per scoprire che diavolo c'è la differenza tra 'def methodname' e' def self.methodname', che è una nuova sintassi per me. – Seldo

0

I blocchi di configurazione vengono eseguiti quando viene valutata la definizione di classe. Quindi, il contesto è la classe stessa, non un'istanza. Quindi, hai bisogno di un metodo di classe, non di un metodo di istanza.

def self.read_config_file 

Che dovrebbe funzionare. Non ho provato però. ;)

+0

temo usando 'self.read_config_file' dà esattamente lo stesso errore. Scusa, avrei dovuto specificare che l'avevo già provato :-) – Seldo

+0

Dannazione, ero ** così vicino **. Il secondo rispondente ha ragione. La definizione della classe viene interpretata mentre il file viene letto, e suppongo che quei blocchi vengano eseguiti immediatamente da Sinatra, quindi è necessario definire il metodo di classe prima di configurare le linee di configurazione. –

Problemi correlati