2012-04-05 9 views
6

Tengo una aplicación que Sinatra, se reducía, básicamente se ve así:¿Cómo se define un método para llamar desde el bloque de configuración de una aplicación de sinatra modular?

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 

Por desgracia, esto no funciona. Obtengo undefined method read_config_file for MyApp:Class (NoMethodError)

La lógica en read_config_file no es trivial, así que no quiero duplicar en ambas. ¿Cómo puedo definir un método que pueda invocarse desde mis dos bloques de configuración? ¿O acabo de abordar este problema de una manera completamente incorrecta?

Respuesta

5

Parece que el bloque configure se ejecuta cuando se lee el archivo. Sólo hay que mover la definición de su método antes de que el bloque de configuración, y convertirlo en un método de clase:

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! Eso funciona. Ahora tengo que ir a leer un libro de rubíes para descubrir cuál es la diferencia entre 'def methodname' y' def self.methodname', que es una sintaxis nueva para mí. – Seldo

0

Sus bloques de configuración se ejecutan cuando se evalúa la definición de la clase. Entonces, el contexto es la clase misma, no una instancia. Entonces, necesitas un método de clase, no un método de instancia.

def self.read_config_file 

Eso debería funcionar. Aunque no he probado. ;)

+0

Me temo que el uso de 'self.read_config_file' da exactamente el mismo error. Lo siento, debería haber especificado que ya había intentado esto :-) – Seldo

+0

Maldita sea, estaba ** tan cerca **. El segundo respondedor es correcto. La definición de clase se interpreta a medida que se lee el archivo, y creo que esos bloques son ejecutados inmediatamente por Sinatra, por lo que debe definir el método de clase antes de configurar las líneas de configuración. –

Cuestiones relacionadas