Heroku Rails 4 静态背景图片未部署

Posted

技术标签:

【中文标题】Heroku Rails 4 静态背景图片未部署【英文标题】:Heroku Rails 4 static background images not deployed 【发布时间】:2014-01-28 22:20:05 【问题描述】:

我一直在查看所有不提供静态图像的 Rails 4 帖子,但似乎无法缓解我遇到的问题。

看看https://fierce-meadow-1536.herokuapp.com

徽标似乎已送达,因为这是我放的第一张图片之一。几周后,我开始了设计阶段并添加了更多图片,但没有一张出现。

以灰色标题为例,上面写着“所有工作”实际上应该在它下面有一个背景图像

你认为发生了什么?

这就是我部署到 heroku 的内容 -->

Fetching repository, done.
Counting objects: 13, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 609 bytes, done.
Total 7 (delta 6), reused 0 (delta 0)

-----> Removing .DS_Store files
-----> Ruby app detected
-----> Compiling Ruby/Rails
-----> Using Ruby version: ruby-2.0.0
-----> Installing dependencies using Bundler version 1.5.1
       Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
       Using rake (10.1.0)
       Using i18n (0.6.9)
       Using minitest (4.7.5)
       Using multi_json (1.8.2)
       Using atomic (1.1.14)
       Using tzinfo (0.3.38)
       Using builder (3.1.4)
       Using rack (1.5.2)
       Using erubis (2.7.0)
       Using mime-types (1.25.1)
       Using activerecord-deprecated_finders (1.0.3)
       Using polyglot (0.3.3)
       Using arel (4.0.1)
       Using bcrypt-ruby (3.0.1)
       Using will_paginate (3.0.4)
       Using sass (3.2.12)
       Using json (1.8.1)
       Using execjs (2.0.2)
       Using thor (0.18.1)
       Using coffee-script-source (1.6.3)
       Using fssm (0.2.10)
       Using chunky_png (1.2.9)
       Using hike (1.2.3)
       Using tilt (1.4.1)
       Using mini_portile (0.5.2)
       Using pg (0.15.1)
       Using nested_form (0.3.2)
       Using pr_geohash (1.0.0)
       Using bundler (1.5.1)
       Using rails_serve_static_assets (0.0.1)
       Using rubyzip (0.9.9)
       Using rails_stdout_logging (0.0.3)
       Using ruby-ole (1.2.11.7)
       Using temple (0.6.7)
       Using rsolr (1.0.9)
       Using thread_safe (0.1.3)
       Using rack-test (0.6.2)
       Using treetop (1.4.15)
       Using bootstrap-will_paginate (0.0.9)
       Using rdoc (3.12.2)
       Using bootstrap-sass (2.3.2.0)
       Using uglifier (2.3.2)
       Using compass (0.12.2)
       Using coffee-script (2.2.0)
       Using nokogiri (1.6.0)
       Using rails_12factor (0.0.2)
       Using slim (2.0.2)
       Using spreadsheet (0.9.6)
       Using sunspot (2.1.0)
       Using mail (2.5.4)
       Using compass-rails (1.1.2)
       Using sdoc (0.3.20)
       Using roo (1.13.0)
       Using sprockets (2.10.1)
       Using activesupport (4.0.0.rc2)
       Using faker (1.1.2)
       Using actionpack (4.0.0.rc2)
       Using actionmailer (4.0.0.rc2)
       Using sprockets-rails (2.0.1)
       Using railties (4.0.0.rc2)
       Using formtastic (2.2.1)
       Using coffee-rails (4.0.0)
       Using sass-rails (4.0.0)
       Using jquery-rails (3.0.4)
       Using chosen-rails (1.0.2)
       Using activemodel (4.0.0.rc2)
       Using jbuilder (1.5.3)
       Using carrierwave (0.9.0)
       Using activerecord (4.0.0.rc2)
       Using rails (4.0.0.rc2)
       Using sunspot_rails (2.1.0)
       Your bundle is complete!
       Gems in the groups development and test were not installed.
       It was installed into ./vendor/bundle
       Bundle completed (1.34s)
       Cleaning up the bundler cache.
-----> Writing config/database.yml to read from DATABASE_URL
-----> Preparing app for Rails asset pipeline
       Running: rake assets:precompile
       cp public/assets/chosen-sprite@2x-5975a8658625306b2570c7c4146f8595.png public/assets/chosen-sprite@2x.png
       cp public/assets/chosen-sprite-fa9df9bbee9f1ab89799379cb153636e.png public/assets/chosen-sprite.png
       Asset precompilation completed (13.88s)
       Cleaning assets
-----> WARNINGS:
       You have not declared a Ruby version in your Gemfile.
       To set your Ruby version add this line to your Gemfile:
       ruby '2.0.0'
       # See https://devcenter.heroku.com/articles/ruby-versions for more information.
-----> Discovering process types
       Procfile declares types -> (none)
       Default types for Ruby  -> console, rake, web, worker

-----> Compressing... done, 38.9MB
-----> Launching... done, v29
       http://fierce-meadow-1536.herokuapp.com deployed to Heroku

这是我的 gemfile -->

source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.0.rc2'
gem 'bootstrap-sass', '2.3.2.0'
gem 'faker', '1.1.2'
gem 'will_paginate', '3.0.4'
gem 'bootstrap-will_paginate', '0.0.9'

gem 'carrierwave' # for resume upload http://railscasts.com/episodes/253-carrierwave-file-uploads
gem "nested_form" # added to assets pipeline

gem 'roo' # for importing old users http://railscasts.com/episodes/396-importing-csv-and-excel

gem 'sunspot_rails' # one field search -- http://railscasts.com/episodes/278-search-with-sunspot

# for advanced search, try http://railscasts.com/episodes/111-advanced-search-form-revised  // very cool way to filter

gem 'annotate', '2.5.0', group: :development



group :development, :test do
  gem 'sqlite3', '1.3.8'
  gem 'rspec-rails', '2.13.1'
end

group :test do
  gem 'selenium-webdriver', '2.35.1'
  gem 'capybara', '2.1.0'
end
# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0.rc2'

gem 'slim'

# Use Uglifier as compressor for javascript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails'

gem 'chosen-rails' #http://harvesthq.github.io/chosen/ https://github.com/tsechingho/chosen-rails

gem 'formtastic'

# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
# gem 'turbolinks' Removed turbolinks, because problems loading camera and common app js http://***.com/questions/20662426/rails-not-loading-js-in-chome-from-link-to

# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 1.2'


group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

group :production do
  gem 'pg', '0.15.1'
  gem 'rails_12factor', '0.0.2'
  gem 'rails_serve_static_assets'
end

# Use ActiveModel has_secure_password
 gem 'bcrypt-ruby', '~> 3.0.0'

# Use unicorn as the app server
# gem 'unicorn'

# Use Capistrano for deployment
# gem 'capistrano', group: :development

# Use debugger
# gem 'debugger', group: [:development, :test]

这是我的生产配置文件 -->

Atlas::Application.configure do
  # Settings specified here will take precedence over those in config/application.rb.

  # Code is not reloaded between requests.
  config.cache_classes = true

  # Eager load code on boot. This eager loads most of Rails and
  # your application in memory, allowing both thread web servers
  # and those relying on copy on write to perform better.
  # Rake tasks automatically ignore this option for performance.
  config.eager_load = true

  # Full error reports are disabled and caching is turned on.
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  # Enable Rack::Cache to put a simple HTTP cache in front of your application
  # Add `rack-cache` to your Gemfile before enabling this.
  # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid.
  # config.action_dispatch.rack_cache = true

  # Disable Rails's static asset server (Apache or nginx will already do this).
  config.serve_static_assets = true

  # Compress JavaScripts and CSS.
  config.assets.js_compressor = :uglifier
  # config.assets.css_compressor = :sass

  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = false

  # Generate digests for assets URLs.
  config.assets.digest = true

  # Version of your assets, change this if you want to expire all your assets.
  config.assets.version = '1.0'

  # Specifies the header that your server uses for sending files.
  # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
  # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx

  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  config.force_ssl = true

  # Set to :debug to see everything in the log.
  config.log_level = :info

  # Prepend all log lines with the following tags.
  # config.log_tags = [ :subdomain, :uuid ]

  # Use a different logger for distributed setups.
  # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)

  # Use a different cache store in production.
  # config.cache_store = :mem_cache_store

  # Enable serving of images, stylesheets, and JavaScripts from an asset server.
  # config.action_controller.asset_host = "http://assets.example.com"

  # Precompile additional assets.
  # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
  # config.assets.precompile += %w( search.js )

  # Ignore bad email addresses and do not raise email delivery errors.
  # Set this to true and configure the email server for immediate delivery to raise delivery errors.
  # config.action_mailer.raise_delivery_errors = false

  config.action_mailer.default_url_options =  :host => "fierce-meadow-1536.herokuapp.com" 

  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
  # the I18n.default_locale when a translation can not be found).
  config.i18n.fallbacks = true

  # Send deprecation notices to registered listeners.
  config.active_support.deprecation = :notify

  # Disable automatic flushing of the log to improve performance.
  # config.autoflush_log = false

  # Use default logging formatter so that PID and timestamp are not suppressed.
  config.log_formatter = ::Logger::Formatter.new
end

【问题讨论】:

【参考方案1】:

运行heroku run bash,然后转到cd public/assets 并运行ls。您将看到所有图像文件现在都在其名称后附加了一个哈希(这是为缓存清除而完成的)。

您需要在 scss 文件中使用 scss 帮助程序,而不是使用 url(assets/image-file.png) 使用 image-url('image-file.png'),它会在部署到生产环境时正确解析映像名称。

欲了解更多信息结帐:How to reference images in CSS within Rails 4

【讨论】:

【参考方案2】:

我的app/assets/images 目录中有*.jpeg 文件,我注意到Heroku 将它们编译为具有.jpg 扩展名。因为我试图渲染:

<%= image_tag('my_image.jpeg') %>

找不到预编译的图像。我将图像文件的文件扩展名更改为.jpg,并将我的图像标签更改为:

<%= image_tag('my_image.jpg') %>

Heroku 能够正确显示图像。

【讨论】:

【参考方案3】:

我认为应该注意这一点,至少对于像我这样还不熟悉 Rails 的一些配置约定的其他人来说,因为我还没有找到应该在 application.rb 文件中放置什么位置的答案'config.serve_static_assets = true',我通过确保它出现在“require 'rails/all'”之后进行了实验,现在它终于适合我了......值得......

【讨论】:

以上是关于Heroku Rails 4 静态背景图片未部署的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4图像未在heroku上加载

使用带有 bootstrap-sass gem 的 Rails 4 无法让 CSS 在 Heroku 上工作

Heroku:错误 - /bin/sh:1:npm:部署到 Heroku 时未找到

Heroku + Rails + GeoIp = 未初始化的常量 GeoIP 错误

在'rake assets:precompile'之后,Rails 4 资产未加载到 Heroku

部署到Heroku:NoMethodError:nil:NilClass的未定义方法'+'