Подтвердить что ты не робот

Рубин на рельсах - Статический метод

Я хочу, чтобы метод выполнялся каждые 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
4b9b3361

Ответ 1

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

def self.checkPings
  # A static method
end

... или...

class Myclass extend self

  def checkPings
    # Its static method
  end

end

Ответ 2

Вы можете использовать статические методы в 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.

Ответ 3

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

class MyModel
  def checkPings
  end
end

to

class MyModel
  def self.checkPings
  end
end

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

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

Ответ 4

Вместо расширения 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

Ответ 5

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

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