web-dev-qa-db-fra.com

Ruby on Rails - Méthode statique

Je veux qu'une méthode soit exécutée toutes les 5 minutes, je l'ai implémentée à chaque fois pour Ruby (cron). Mais cela ne fonctionne pas. Je pense que ma méthode n'est pas accessible. La méthode que je veux exécuter est situé dans une classe. Je pense que je dois rendre cette méthode statique pour pouvoir y accéder avec MyClass.MyMethod. Mais je ne trouve pas la bonne syntaxe ou je cherche peut-être au mauvais endroit.

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
54
Nostrodamus

Pour déclarer une méthode statique, écrivez ...

def self.checkPings
  # A static method
end

... ou ...

class Myclass extend self

  def checkPings
    # Its static method
  end

end
93
Ashish

Vous pouvez utiliser des méthodes statiques dans Ruby comme ceci:

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"

Notez également que vous utilisez une mauvaise convention de dénomination pour votre méthode. CA devrait etre check_pings à la place, mais cela n'affecte pas si votre code fonctionne ou non, c'est juste le style Ruby.

58
Simon Woker

Changez votre code de

class MyModel
  def checkPings
  end
end

à

class MyModel
  def self.checkPings
  end
end

Notez qu'il est ajouté automatiquement au nom de la méthode.

def checkPings est une méthode d'instance pour la classe MyModel alors que def self.checkPings est une méthode de classe.

13
ssri

Au lieu d'étendre self pour toute la classe, vous pouvez créer un bloc qui s'étend de soi et définir vos méthodes statiques à l'intérieur.

vous feriez quelque chose comme ceci:

class << self
#define static methods here
end

Donc, dans votre exemple, vous feriez quelque chose comme ceci:

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

et vous pouvez l'appeler comme suit: Ping.checkPings

4
Joseph