我在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任务运行时。
有什么想法吗?
答案 0 :(得分:1)
您似乎已经创建了扩展名为.rb的rake文件
lib/rake/searches.rb
可以尝试将其更改为
lib/rake/searches.rake
那应该有用
答案 1 :(得分:0)
这是因为:environment
任务完成后,Rails 3.2中的生产环境未完全加载。
如果您明确要求SearchWorker
即
require 'app/workers/search_worker'
在任务块的开头,它会起作用。
(为什么自动加载不是为你做的,我不知道)