Rake任务在生产中不起作用

时间:2013-01-31 06:06:00

标签: ruby-on-rails rake

我在lib/rake/searches.rb中的Rails 3.2.11应用程序中有这个rake任务:

namespace :searches do
  desc "Start background searches"
  task :start => :environment do
    Rails.logger.info "Starting searches..."
    Campaign.all.each do |c|
      next unless c.recurring?

      Rails.logger.info "Starting searches for campaign '#{c.name}'"
      SearchWorker.enqueue(:campaign_id => c.id, :clear => true)
    end
  end
end

当我在本地运行它时一切顺利。当我在生产中运行它时会出错:

$ bundle exec rake searches:start
rake aborted!
uninitialized constant SearchWorker
/var/apps/web/lib/tasks/searches.rake:9:in `block (3 levels) in <top (required)>'
/var/apps/web/lib/tasks/searches.rake:5:in `block (2 levels) in <top (required)>'
Tasks: TOP => searches:start
(See full trace by running task with --trace)

当我跳进控制台会话时,我可以看到该类已正确自动加载:

$ bundle exec rails console
Loading production environment (Rails 3.2.11)
irb(main):001:0> SearchWorker
=> SearchWorker

这些工作人员居住在app/workers,并将其添加到application.rb中的autoload_paths配置设置中:

# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)
config.autoload_paths += %W(
    #{config.root}/custom_scripts
    #{config.root}/app/workers
    #{config.root}/app/models/filters
)

所以我不知道为什么错误只发生在生产中,以及从rake任务运行时。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您似乎已经创建了扩展名为.rb的rake文件

lib/rake/searches.rb

可以尝试将其更改为

lib/rake/searches.rake

那应该有用

答案 1 :(得分:0)

这是因为:environment任务完成后,Rails 3.2中的生产环境未完全加载。

如果您明确要求SearchWorker

require 'app/workers/search_worker'

在任务块的开头,它会起作用。

(为什么自动加载不是为你做的,我不知道)