Ruby on rails 3.1 如何使用Rails 3.1和资产管道在Heroku上配置Resque
安装Resque gem并运行worker后,我的应用程序现在会产生一个资产管道错误: Sass:SyntaxError:找不到要导入的文件或文件不可读 我创建了一个新的分支,并将问题缩小到运行Resque worker。我只更改了三个文件。以下是复制的步骤: 1) 将Resque gem添加到gem文件:Ruby on rails 3.1 如何使用Rails 3.1和资产管道在Heroku上配置Resque,ruby-on-rails-3.1,heroku,asset-pipeline,resque,Ruby On Rails 3.1,Heroku,Asset Pipeline,Resque,安装Resque gem并运行worker后,我的应用程序现在会产生一个资产管道错误: Sass:SyntaxError:找不到要导入的文件或文件不可读 我创建了一个新的分支,并将问题缩小到运行Resque worker。我只更改了三个文件。以下是复制的步骤: 1) 将Resque gem添加到gem文件: gem 'resque' 2) 创建一个Resque rake任务: # lib/resque.rake require 'resque/tasks' task "resque:set
gem 'resque'
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
3) 将工作程序添加到程序文件:
web: bundle exec rails server -p $PORT thin
worker: bundle exec rake resque:work
我有一种感觉,问题是工人试图加载我所有的资产。我不想这样,因为这只是一个后台过程。我甚至没有运行Resque前端,因此问题与此无关。罪魁祸首实际上是在我的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
Heroku在slug编译期间运行assets:precompile。在预编译期间,将加载环境,但Heroku不会传入环境变量。URI分析行由于以下原因失败:
ENV['REDISTOGO_URL']
零。这导致assets:precompilerake任务失败
解决方案是添加:
config.assets.initialize_on_precompile = false
到application.rb文件
这在Rails 3.1.1中可用,当设置为false时,编译资产时将不再加载环境。大多数时候,这是一个安全的选择
感谢Neil为我指出了正确的方向。在Rails 4中,initialize\u on\u precompile选项已被弃用 我在Rails 4应用程序中遇到了同样的问题,并决定如果没有设置REDISTOGO_URL配置变量(例如,在assets:precompile期间),就不需要创建Redis连接。所以我改变了我的redis.rb:
if ENV.include?('REDISTOGO_URL')
uri = URI.parse(ENV["REDISTOGO_URL"])
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
end
config.assets.initialize\u on\u precompile
是否设置为false?