Techioz Blog

アセット パイプライン レール Heroku

概要

最近、プロジェクトを Rails 5 にアップグレードしたのですが、すべてを Heroku にアップロードしようとすると、アセット パイプラインがおかしくなってしまいます。

問題は次のとおりです。私は Ejercicios のコレクションを持っており、そのうちの 1 つをクリックすると、アプリには画像を含むその情報が表示されるはずです。画像へのルートは、img1: “ejercicios/abdominales/1_4_I1.bmp” のように私のデータベースに保存されています。たとえば、そのファイルは app/assets/images/ejercicios/abdominales/1_4_I1.bmp にあります。

関連ビュー show.html.haml は、次のように画像を出力します: = image_tag(@ejercicio.img1) if @ejercicio.img1?。

ローカルでは完璧に機能しましたが、Heraku の実稼働環境では機能しませんでした。そのため、機能させるにはアセット パイプラインについて読んでください。そこで、show.html.hamml を次のように変更しました。 = image_tagasset_path(@ejercicio.img1) if @ejercicio.img1?そして、チュートリアルで言及されている行を Gemfile と application.rb に追加しました。実行されたバンドルのインストールとバンドルの実行 rake Assets:precompile RAILS_ENV=production、新しい「public」フォルダーを Git に追加し、Git をコミットしてプッシュし、最後にすべてを Heroku にプッシュしました。

しかし、それは機能せず、画像の「alt」が表示されます。インスペクタを使用すると、HTML 内の画像がフィンガープリント付きの URL ではなく、画像への通常の URL に従っていることがわかります。そのため、ヘルパーのasset_path が正しく機能していないようです。

これがconfig/environmentsのproduction.rbです。

KeepMeFit::Application.configure do

  config.eager_load = true
  config.cache_classes = true

  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  config.serve_static_assets = true

  config.assets.compress = true

  config.assets.compile = true

  config.assets.digest = falsenginx

  config.force_ssl = true

  config.i18n.fallbacks = true

  config.active_support.deprecation = :notify


  config.action_mailer.default_url_options = { :host => "http://keepmefit.herokuapp.com/"}
end

「config」の「application.rb」:

require File.expand_path('../boot', __FILE__)

require 'rails/all'

require 'will_paginate/array'

if defined?(Bundler)
  Bundler.require(*Rails.groups(:assets => %w(development test)))
end

module KeepMeFit
  class Application < Rails::Application
    config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    config.i18n.default_locale = :es

    config.encoding = "utf-8"

    config.filter_parameters += [:password, :password_confirmation]

    config.active_support.escape_html_entities_in_json = true

    config.assets.enabled = true
    config.serve_static_assets = true

    config.assets.initialize_on_precompile = false

    config.assets.version = '1.0'

  end
end

そして私の Gemfile:

source 'https://rubygems.org'

ruby '2.3.3'

gem 'rails', '5.1.4'

group :development, :test do
    gem 'sqlite3'
  gem 'activemodel'
  gem 'json'

    gem 'rspec-rails'
    gem 'guard-rspec'
    gem 'rb-notifu'
    # gem 'railroady'
end

gem 'rails_12factor', group: :production
group :production do
    gem 'pg'
end

group :test do
    gem 'capybara'
    gem 'factory_girl_rails', '4.1.0'
    gem 'launchy'
end

group :development do
    gem 'annotate'
    gem 'better_errors'
    gem 'binding_of_caller'
    gem 'meta_request'
end


group :assets do
  gem 'sass-rails'
  gem 'coffee-rails'
    gem 'coffee-script-source', '1.8.0'

  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'
gem 'bcrypt', '~> 3.1.11', platforms: [:ruby, :x64_mingw, :mingw]

gem 'haml'
gem 'haml-rails'

gem 'bootstrap-sass'

require 'rbconfig'
gem 'wdm', '>= 0.1.0' if RbConfig::CONFIG['target_os'] =~ /mswin|mingw/i

gem 'modernizr-rails'

#gem "font-awesome-rails"

gem 'bootstrap-datepicker-rails'
gem 'tzinfo-data'

gem 'faker', '1.1.2'

gem 'will_paginate', '~> 3.1.0'
gem 'bootstrap-will_paginate'

gem 'turbolinks'
gem 'jquery-turbolinks'

gem 'friendly_id'

gem 'gon'

gem 'cloudinary'

解決策

アセット パイプラインには基本的に 2 つのユースケースがあります。

まず、さまざまなスタイルシートまたは JavaScript ファイルをプリコンパイルして単一のバンドルに結合します。たとえば、SCSS を CSS にプリコンパイルできるため、開発が簡素化されます。また、結合された 1 つの大きなファイルは、多数の小さなファイルよりも速くダウンロードできます。

次に、ファイル名にハッシュを追加します。これにより、これらのファイルを長期間キャッシュできるようになり、パフォーマンスも向上します。ファイルの 1 つに小さな変更しかない場合でも、ハッシュが変更され、したがってファイル名も変更されます。変更されたファイル名はキャッシュにないため、ブラウザはファイルをすぐに再読み込みします。

しかし、あなたの場合、画像はとにかく静的です。イメージをプリコンパイルしたり、変更が想定されていないファイルにハッシュを追加したりしても意味がありません。

したがって、私はその画像をパブリック フォルダーに直接配置し、この種の静的画像のアセット パイプラインをバイパスします。