3

controller.rb ファイル内で毎分特定のメソッドを実行しようとしています。レールにいつでもgemを使用することを検討していますが、これを行う方法について少し混乱しています。

現在、schedule.rb には次のものがあります。

every 1.minutes do 
runner "Server.update_all_servers"
end

runner コマンドが何をするのか正確にはわかりません。誰かがこのコマンドが正確に何をするのか説明できますか? 私の理解では、Model.ModelMethod を呼び出しますが、update_all_servers() という application_controller.rb のメソッドを呼び出す必要があります。これを行うことは可能ですか?または、application_controller.rb 内にあるものをすべてモデル ファイル (/models/server.rb にあるファイルなど) に移動する必要がありますか?

4

2 に答える 2

5

Serverでクラスを作成できます/lib

class ServerUpdater
    attr_accessor :servers

    def initialize(servers = nil)
        @servers = servers || Server.all
    end

    def update_all
        servers.find_each { |server| server.update_info }
    end
end

次に、コントローラーを呼び出すことができServerUpdater.new(@servers).update_allます。

cron ジョブでは、次のように呼び出します。ServerUpdater.new(Server.all).update_all

update_infoそして、ロジックを含むモデル内のメソッドが必要になります。

于 2012-09-06T18:17:22.540 に答える
1

同じ質問があり、簡単に解決し、lib に何も追加する必要がなかったので、共有したいと思いました。

コントローラーアクションを呼び出したい場合、モデルメソッドにすべてのロジックを含めるだけで、とにかくそれがベストプラクティスです。その後、ランナーは単純にモデル メソッドを呼び出すことができます。

every 1.minutes do 
  runner "Server.update_all_servers"
end

Server.update_all_servers は、コントローラー アクションではなく、サーバー モデルのメソッドである必要があります。

于 2013-04-12T16:48:57.350 に答える