Рубин на рельсах. Статический метод - PullRequest
54 голосов
/ 08 марта 2011

Я хочу, чтобы метод выполнялся каждые 5 минут, я всегда реализовывал для ruby ​​(cron). Но это не работает. Я думаю, что мой метод не доступен. Метод, который я хочу выполнить, находится в классе. Я думаю, что я должен сделать этот метод статическим, чтобы я мог получить к нему доступ MyClass.MyMethod. Но я не могу найти правильный синтаксис или, возможно, я смотрю не в том месте.

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

Ответы [ 5 ]

92 голосов
/ 08 марта 2011

Чтобы объявить статический метод, напишите ...

def self.checkPings
  # A static method
end

... или ...

class Myclass extend self

  def checkPings
    # Its static method
  end

end
58 голосов
/ 08 марта 2011

Вы можете использовать статические методы в Ruby следующим образом:

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"

Также обратите внимание, что вы используете неправильное соглашение об именах для вашего метода.Вместо этого он должен быть check_pings, но это не влияет на то, работает ваш код или нет, это просто стиль ruby.

13 голосов
/ 08 марта 2011

Измените ваш код с

class MyModel
  def checkPings
  end
end

на

class MyModel
  def self.checkPings
  end
end

Обратите внимание, что к названию метода добавляется self.

def checkPings - это метод экземпляра длякласс MyModel, тогда как def self.checkPings является методом класса.

4 голосов
/ 27 июля 2016

Вместо того, чтобы расширять self для всего класса, вы можете создать блок, который выходит из себя и определить ваши статические методы внутри.

вы бы сделали что-то вроде этого:

class << self
#define static methods here
end

Итак, в вашем примере вы бы сделали что-то вроде этого:

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

и вы можете назвать его следующим образом: Ping.checkPings

0 голосов
/ 08 марта 2011

У вас не может быть статических методов в Ruby. В Ruby все методы являются динамическими. В Ruby есть только один вид методов: методы динамических экземпляров.

Действительно, термин статический метод в любом случае является неправильным. Статический метод - это метод, который не связан с каким-либо объектом и который не отправляется динамически (следовательно, «статический»), но эти два в значительной степени являются определением того, что означает быть «методом» , У нас уже есть совершенно хорошее имя для этой конструкции: процедура .

...