web-dev-qa-db-ja.com

Ruby on Rails-静的メソッド

メソッドを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
54
Nostrodamus

静的メソッドを宣言するには、次のように記述します...

def self.checkPings
  # A static method
end

...または...

class Myclass extend self

  def checkPings
    # Its static method
  end

end
93
Ashish

次のように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スタイルです。

58
Simon Woker

からコードを変更

class MyModel
  def checkPings
  end
end

class MyModel
  def self.checkPings
  end
end

メソッド名に自己追加されていることに注意してください。

def checkPingsはMyModelクラスのインスタンスメソッドであり、def self.checkPingsはクラスメソッドです。

13
ssri

クラス全体に対してselfを拡張する代わりに、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

4
Joseph