Heroku 资产未加载并且资产似乎已过时

Heroku assets are not loading and seems assets are out of date

我遇到了一个问题,我的 Heroku 生产站点上的图像找不到。我已经追踪到文件系统中的摘要与它在应用程序中寻找的摘要不同。例如,在日志中我看到以下错误:

app[web.1]: Started GET "/assets/nfl_teams/nfcn/chi-6317d0375db3876a5057f2da59bab1dc.jpeg" for 24.55.52.101 at 2016-09-08 23:10:18 +0000

app[web.1]: ActionController::RoutingError (No route matches [GET] "/assets/nfl_teams/nfcn/chi-6317d0375db3876a5057f2da59bab1dc.jpeg"):
app[web.1]:   vendor/bundle/ruby/2.2.0/gems/actionpack-4.2.5/lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
app[web.1]:   vendor/bundle/ruby/2.2.0/gems/actionpack-4.2.5/lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
app[web.1]:   vendor/bundle/ruby/2.2.0/gems/railties-4.2.5/lib/rails/rack/logger.rb:38:in `call_app'

当我转到 Heroku 控制台并使用 asset_path() 查找资产时,我得到以下信息:

$ heroku run rails console
Running rails console on ⬢ fbpm... up, run.7463
Loading production environment (Rails 4.2.5)
irb(main):001:0> puts helper.asset_path("nfl_teams/nfcn/chi.jpg")
/assets/nfl_teams/nfcn/chi-93d8c8c53ac98c60f7f3fee1fade067dfa9489b24b8fa4bb9fedd4b12da129de.jpg
=> nil
irb(main):002:0> 

最后查看 heroku bash 并检查我得到的目录中的文件:

$ heroku run bash
Running bash on ⬢ fbpm... up, run.7321
cd public~ $ cd public/assets/nfl_teams/nfcn
~/public/assets/nfl_teams/nfcn $ ls chi*.jpg
chi-93d8c8c53ac98c60f7f3fee1fade067dfa9489b24b8fa4bb9fedd4b12da129de.jpg
~/public/assets/nfl_teams/nfcn $ 

因此,在查看资产路径的控制台中,我得到以下文件:

/assets/nfl_teams/nfcn/chi-93d8c8c53ac98c60f7f3fee1fade067dfa9489b24b8fa4bb9fedd4b12da129de.jpg

当我查看目录结构时,我得到了相同的文件。但由于某种原因,应用程序正在寻找此文件:

/assets/nfl_teams/nfcn/chi-6317d0375db3876a5057f2da59bab1dc.jpeg

不存在并引发路由错误。

这是我的 Gemfile:

source 'https://rubygems.org'
ruby '2.2.4'
#ruby-gemset=Rails_fb

gem 'rails','4.2.5'
gem 'bcrypt', '3.1.11'
gem 'annotate'
gem 'faker', '1.6.3'
gem 'select2-rails'
gem 'simple_form', '3.1.1'
gem 'cocoon'

#
# Bootstrap support gems
#
gem 'bootstrap-sass'
gem 'bootstrap-will_paginate', '0.0.10'
gem 'font-awesome-sass', '4.6.2'
gem 'font-awesome-rails'
gem 'sass-rails', '~> 5.0.4'
#gem 'select2-sass-bootstrap-rails'

# The following Gem is used to parse the NFL page for schedules to build
# a season.
gem 'nokogiri'

# Database.  Using the same database for production/development
gem 'pg'

group :development, :test do
  gem 'rspec-rails', '~>3.0'
  gem 'factory_girl_rails', '4.7.0'
  gem 'capybara', '2.7.1'
  gem 'database_cleaner'
  gem 'guard-rspec', '~> 4.2'
  gem 'spork-rails'
  gem 'guard-spork'
  gem 'childprocess', '0.5.8'
  gem 'letter_opener_web', '~>1.2.0'
end

group :test do
  gem 'pry'
  gem 'selenium-webdriver', '2.53.0'
  gem 'libnotify', '0.9.1'
end

gem 'uglifier', '2.7.2'
gem 'coffee-rails', '4.1.1'
gem 'jquery-rails', '3.1.4'
gem 'jquery-turbolinks', '2.1.0'
gem 'turbolinks', '2.5.3'
gem 'jbuilder', '2.4.1'

group :doc do
  gem 'sdoc', '0.4.1', require: false
end

group :production do
  gem 'rails_12factor'
end

# To use debugger
# gem 'debugger'

gem 'execjs'
gem 'therubyracer', :platforms => :ruby

这是我用来访问我视图中的图像的代码(我已经尝试过使用和不使用 asset_path() 调用):

<%= image_tag(asset_path(team.imagePath), size: "40") %>

任何人都可以告诉我为什么应用程序正在寻找错误的文件吗?显然资产管道中存在一些断开连接,但我不知道在哪里?

这个问题是在我从 Ruby 2.0.0 升级到 Ruby 2.2.4 后开始的,这导致我更新了一些 Gems。

希望这对您有所帮助。为了在 Rails 4 中强制在 Heroku 上进行新的资产预编译,您需要执行以下操作:

  • 耙子assets:clobber

  • 耙子assets:precompile

然后 git commit/push 掌握并推送到 Heroku,它应该做一个新的预编译,希望能同步资产管道。 不要使用 rake assets:clean,因为它不会强制进行新的编译。