2011-03-08 12 views
52

Quiero un método que se ejecutará cada 5 minutos, cada vez que he implementado para Ruby (cron). Pero no funciona. Creo que mi método no es accesible. El método que quiero ejecutar se encuentra en una clase. Creo que tengo que hacer ese método estático para poder acceder a él con MyClass.MyMethod. Pero no puedo encontrar la sintaxis correcta o tal vez estoy buscando en el lugar equivocado.Ruby on Rails - Método estático

Schedule.rb

every 5.minutes do 
    runner "Ping.checkPings" 
end 

Ping.rb

def checkPings  
    gate = Net::Ping::External.new("10.10.1.1") 
    @monitor_ping = Ping.new() 

    if gate.ping?   
    MonitorPing.WAN = true 
    else 
    MonitorPing.WAN = false 
    end 

    @monitor_ping.save  
end 

Respuesta

86

Para declarar un método estático, escribir ...

def self.checkPings 
    # A static method 
end 

... o ...

class Myclass extend self 

    def checkPings 
    # Its static method 
    end 

end 
+7

I no se puede reproducir el último ejemplo, 'def checkPings extends self'. ¿Es esta sintaxis válida? –

+1

Tu clase tiene que ampliarse para hacer que todos los métodos estén estáticos dentro de la clase. – Ashish

56

Puede utilizar los métodos estáticos en Ruby como esto:

class MyModel 
    def self.do_something 
     puts "this is a static method" 
    end 
end 
MyModel.do_something # => "this is a static method" 
MyModel::do_something # => "this is a static method" 

Observe también que está utilizando una convención de nomenclatura inadecuado para su método. Debería ser check_pings en su lugar, pero esto no afecta si su código funciona o no, es solo el estilo ruby.

+2

¡Gracias por la respuesta y la sugerencia! (y) – Nostrodamus

+0

+1 para el uso – dopplesoldner

+0

Debe cambiar el nombre de su método como se sugiere; importa cuando mira este código por un tiempo. Y le importa a alguien más que también tenga que leer ese código, generalmente para descubrir que el (cualquier) código no funciona (que está acostumbrado al estilo normal, que es el de todos los que conozco que programan en Ruby). –

13

cambiar su código de

class MyModel 
    def checkPings 
    end 
end 

a

class MyModel 
    def self.checkPings 
    end 
end 

Nota no es auto añade al nombre del método.

def checkPings es un método de instancia para la MyModel clase mientras que def self.checkPings es un método de clase.

-14

No se puede tener métodos estáticos en Ruby. En Ruby, todos los métodos son dinámicos. Solo hay un tipo de método en Ruby: métodos dinámicos de instancia.

En realidad, el método estático término es un término equivocado de todos modos. Un método estático es un método que no está asociado con ningún objeto y que no se distribuye de forma dinámica (de ahí "estático"), pero los dos son más o menos la definición de lo que significa ser un "método". Ya tenemos un nombre perfectamente correcto para esta construcción: un procedimiento .

+23

voto a favor; semántica. Los métodos de Ruby pueden no ser "estáticos", pero el OP simplemente quiere una función de nivel de clase (por ejemplo, MyClass :: doThing()), que es totalmente factible en ruby. "No se puede hacer eso en ruby" no es útil. – Doug

+7

super inútil respuesta. – andy

+0

Correcto, pero muy quisquilloso con el término "método". Ya sabes lo que significaban. – byxor

4

En lugar de extender self para toda la clase, puede crear un bloque que se extiende desde uno mismo y definir sus métodos estáticos dentro.

que haría algo como esto:

class << self 
#define static methods here 
end 

Así que en su ejemplo, tendría que hacer algo como esto:

class Ping 
    class << self 
    def checkPings 
     #do you ping code here 
     # checkPings is a static method 
    end 
    end 
end 

y se le puede llamar de la siguiente manera: Ping.checkPings