1

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

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,他们被添加到autoload_pathsapplication.rb 的配置设置中:

# 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 任务运行时。

有任何想法吗?

4

2 回答 2

1

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

lib/rake/searches.rb

你能试着把它改成

lib/rake/searches.rake

那应该工作

于 2013-01-31T07:39:08.460 回答
0

这是由于 Rails 3.2 中的生产环境在:environment任务完成后没有完全加载。

如果您明确要求SearchWorker即。

require 'app/workers/search_worker'

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

(为什么自动加载不适合你,我不知道)

于 2013-09-06T23:44:31.193 回答