【问题标题】:Rails loading/requiring from/within lib/schedule.rb [whenever]Rails 从/在 lib/schedule.rb 中加载/要求 [无论何时]
【发布时间】:2015-06-26 13:40:25
【问题描述】:

我有几个关于 Rails 调度和类/模块包含的问题。

我在 lib/ 中有一个类,我想在 config/schedule.rb 中实例化它...我需要/包含该类吗?我该怎么做?

另外,我想使用一个模块中的方法,该模块也在 lib 中。我可以通过 ModuleName.methodName(arguments) 访问它还是需要包含一些东西来加载/需要它?

目前我在 schedule.rb 中有这样的内容:

every 32.minutes do
  instance=ClassA.new()
  runner "ModuleName.methodName(#{instance})"
end

我没有任何错误消息,但我认为没有任何实际发生/被调用。

【问题讨论】:

    标签: ruby-on-rails ruby oop object whenever


    【解决方案1】:

    只要提供一种在 crontab (http://en.wikipedia.org/wiki/Cron) 中生成条目的好方法。因此,您可以在日程安排中使用 ruby​​ 以任何您喜欢的方式创建这些条目,但是任何需要发生的事情,例如初始化新类,或在您的应用程序中加载一些配置或其他任何事情,都需要在 cron 调用任务时发生,而不是在您生成 crontab 时。

    例如,如果你想用你的模型做一些事情,我会在你的应用程序中(在 lib/tasks 中)创建一个 rake 任务,如下所示:

    namespace :whatever do
      task name_this_better: :environment do
        instance = ClassA.new()
        ModuleName.methodName(instance)
      end
    end
    

    然后,在您的日程安排中,您可以:

    every 32.minutes do
      rake "whatever:name_this_better"
    end
    

    这不仅使您的代码更清晰、更有条理,而且使事情更可重用。

    【讨论】:

    • 几个问题:如果我不提供环境,会使用默认的吗?另外,我是在 rake 任务开始时将命名空间保留为“命名空间”还是用一些东西填充它?
    • @AggressiveSneeze。您应该将 :whatevername_this_better 替换为更具描述性的名称。传入环境意味着 rake 任务将加载您指定的 rails 环境,使您的 rails 代码可用于 rake 任务。您可以在日程安排的其他地方设置环境(开发、生产等)。
    【解决方案2】:

    您也可以使用https://github.com/tomykaira/clockwork。它创建了简单的 ruby​​ 进程(不使用 Cron,就像 whenever 所做的那样)并且有很多选项可以使用。

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 2013-03-02
      • 2023-03-09
      • 2011-03-12
      • 2012-10-23
      • 2016-11-07
      • 2013-10-06
      • 2018-09-15
      相关资源
      最近更新 更多