如何使用Rails 3.1和资产管道在Heroku上配置Resque

Sea*_*ker 4 heroku resque ruby-on-rails-3.1 asset-pipeline

安装Resque gem并运行worker后,我的app现在会产生资产管道错误:

Sass:SyntaxError:要导入的文件未找到或不可读

我创建了一个新的分支,并将问题缩小到运行Resque工作者.我只改变了三个文件.以下是重现的步骤:

1)将Resque gem添加到Gemfile:

gem 'resque'
Run Code Online (Sandbox Code Playgroud)

2)创建Resque rake任务:

# lib/resque.rake

require 'resque/tasks'

task "resque:setup" => :environment do
    ENV['QUEUE'] = '*'
    Resque.before_fork = Proc.new { ActiveRecord::Base.establish_connection }
end
Run Code Online (Sandbox Code Playgroud)

3)将一个worker添加到Procfile:

web: bundle exec rails server -p $PORT thin
worker: bundle exec rake resque:work
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,问题是工人正试图加载我的所有资产.这是我不想要的,因为它只是一个后台进程.我甚至没有运行Resque前端,所以问题与此无关.

Sea*_*ker 5

罪魁祸首实际上是在我的Resque初始化程序中:

if Rails.env.staging? || Rails.env.production?
  uri = URI.parse ENV['REDISTOGO_URL']
  Resque.redis = Redis.new :host => uri.host, :port => uri.port, :password => uri.password
end
Run Code Online (Sandbox Code Playgroud)

Heroku运行资产:在slug编译期间预编译.在预编译期间加载了环境,但是Heroku没有通过ENV变量.URI解析行由于失败而失败

ENV['REDISTOGO_URL'] 
Run Code Online (Sandbox Code Playgroud)

没有.这导致资产:预编译rake任务失败.

解决方案是添加:

config.assets.initialize_on_precompile = false 
Run Code Online (Sandbox Code Playgroud)

到您的application.rb文件.

这在Rails 3.1.1中可用,当设置为false时,在编译资产时将不再加载环境.大多数时候这是一个安全的选择.

谢谢尼尔指出我正确的方向.