【问题标题】:whenever gem schedule.rb file: doesn't recognize RAILS_ROOT variable每当 gem schedule.rb 文件:不识别 RAILS_ROOT 变量时
【发布时间】:2011-12-20 03:51:51
【问题描述】:

在 schedule.rb 文件中,声明:

require "#{RAILS_ROOT}/config/environment.rb"

 every "10 10 2 * * *" do
      command "mysqldump -u #{@db_username} -p#{@db_password} --single-transaction #{@db_name} > #{@backup_Path}/#{@db_name}.sql 2> log/error_crontab.log"
 end

当我尝试从终端执行任何时候的 cmd 时,出现以下错误:

 config/schedule.rb:48:in `initialize': uninitialized constant Whenever::JobList::RAILS_ROOT (NameError)
    from /usr/local/lib/ruby/gems/1.9.1/gems/whenever-0.7.0/lib/whenever/job_list.rb:19:in `instance_eval'
    from /usr/local/lib/ruby/gems/1.9.1/gems/whenever-0.7.0/lib/whenever/job_list.rb:19:in `initialize'
    from /usr/local/lib/ruby/gems/1.9.1/gems/whenever-0.7.0/lib/whenever.rb:16:in `new'
    from /usr/local/lib/ruby/gems/1.9.1/gems/whenever-0.7.0/lib/whenever.rb:16:in `cron'
    from /usr/local/lib/ruby/gems/1.9.1/gems/whenever-0.7.0/lib/whenever/command_line.rb:40:in `run'
    from /usr/local/lib/ruby/gems/1.9.1/gems/whenever-0.7.0/lib/whenever/command_line.rb:7:in `execute'
    from /usr/local/lib/ruby/gems/1.9.1/gems/whenever-0.7.0/bin/whenever:38:in `<top (required)>'
    from /usr/local/bin/whenever:19:in `load'
    from /usr/local/bin/whenever:19:in `<main>'

我正在使用 require 语句从表单中获取动态值来安排作业。请帮忙解决这个问题?

注意:我看到了以下 stackoverflow 查询: How to detect Rails environment inside whenever

关注此线程以获取动态值,但遇到 require 语句的问题。 Rails - Whenever gem - Dynamic values

Ruby/Rails - Whenever gem - Loop cron tasks

config file in schedule.rb with Rails Whenever gem?

【问题讨论】:

  • Rails 3 弃用 RAILS_ROOT 以支持 Rails.root。你试过了吗?
  • Rails.root 也会抛出同样的错误

标签: ruby-on-rails ruby-on-rails-3 whenever


【解决方案1】:

Whenever 根本不需要也不依赖 Rails,所以当它运行时,RAILS_ROOT 是没有定义的,但是因为只要的 schedule.rb 通常保存在 /config/schedule.rb 中,我们可以假设它是在 Rails 项目中,像这样设置我们自己的 RAILS_ROOT:

# in schedule.rb
RAILS_ROOT = File.dirname(__FILE__) + '/..'

编辑:如果您确实需要加载 Rails,请执行以下操作:

# in schedule.rb
# this will require config/environment and load your entire rails environment
require File.expand_path(File.dirname(__FILE__) + "/environment")

【讨论】:

  • 我正在从表单中获取数据库用户 ID 和密码,因此要将它们传递给 schedule.rb,我需要在 schedule.rb 中加载 rails 环境。
  • @sudhir 在这种情况下,我已将答案更新为实际需要并启动 Rails。
【解决方案2】:

只要开发者已经回答了这个问题,请查看https://github.com/javan/whenever/issues/81

Javan 不再尝试加载 Rails 环境。但是,无论何时执行,它都会自动将路径变量设置为目录。这应该是一样的:

set :output, "#{path}/log/cron.log"

【讨论】:

  • 你很好,我知道有时很难找到解决问题的方法,但是当我终于找到它时,我喜欢分享它以帮助其他人节省时间:D...
【解决方案3】:

在 Rails 4 中尝试:

require File.expand_path(File.dirname(__FILE__) + "/../config/environment")

在您的 schedule.rb 文件中。 这样,您还可以访问所有活动记录模型和初始化程序。

【讨论】:

    猜你喜欢
    • 2013-02-19
    • 2011-02-01
    • 1970-01-01
    • 2013-03-28
    • 2021-02-16
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多