【问题标题】:Rails Whenever Gem How to Run Specific Method in Controller.rb FileRails When Gem 如何在 Controller.rb 文件中运行特定方法
【发布时间】:2012-08-31 14:37:00
【问题描述】:

我希望每分钟在我的 controller.rb 文件中运行一个特定的方法。我正在考虑使用when gem for rails,但我对如何做到这一点有点困惑。

目前在 schedule.rb 我有:

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

我不确定 runner 命令的作用。有人能解释一下这个命令到底是做什么的吗?据我了解,它调用了 Model.ModelMethod,但我需要在 application_controller.rb 中调用一个名为 update_all_servers() 的方法。是否有可能做到这一点?还是我必须将 application_controller.rb 中的任何内容移动到模型文件(例如位于 /models/server.rb 中的那个)?

【问题讨论】:

    标签: ruby-on-rails ruby cron whenever


    【解决方案1】:

    您可以在/lib 中创建Server 类:

    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 方法。

    【讨论】:

    • 于是创建了一个Server.rb 文件,将其放入/lib 中,并创建了我的方法update_all_servers。这个文件是否能够访问 mysql 数据库(即我可以去:@servers.each do |server| Server.find(server.id).update_attributes(:hostname => hostname) end 然后在我的计划中.rb 我说,每 1 分钟运行一次“Server.update_all_servers”结束这个设置似乎对我不起作用。我做错了什么吗?
    • 是的,您可以像在控制器中通过模型访问数据库一样访问数据库。首先,确保您的 cron 作业确实每分钟运行一次,如果确实如此,则检查您的日志以查看是否有错误。 (@servers 是什么?)
    • 日志文件没有显示任何内容。每当 gem 将以下内容放在 crontab 中:* * * * * /bin/bash -l -c 'cd /home/ubuntu/statusboard && script/rails runner -e production '\''Server.update_all_servers'\'''
    • @servers 在我的 servers_controller.rb 中为 @servers = Server.all
    • 您到底想在 update_all_servers 方法中做什么? hostname 来自哪里?如果您在控制器中设置@servers,则不能在您的班级中使用它。您必须使用服务器初始化您的类: Server.new(@servers).update_all_servers...
    【解决方案2】:

    我有同样的问题,我直接解决了,不需要在 lib 中添加任何东西,所以我想分享:

    在您想要调用控制器操作的情况下,您所做的就是在模型方法中包含所有逻辑,无论如何这是最佳实践。然后跑步者可以简单地调用模型方法:

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

    Server.update_all_servers 必须是服务器模型中的方法,而不是控制器操作。

    【讨论】:

      猜你喜欢
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 2023-02-09
      • 2013-07-24
      相关资源
      最近更新 更多