web-dev-qa-db-ja.com

rails-application.cssアセットが本番モードで見つかりません

アセットパイプラインを使用するようにアプリケーションをアップグレードしています。

Cssアセットをアプリケーションのcssファイルにコンパイルしましたが、実稼働モードでアプリケーションを実行したときにそれらが見つかりません

Rails_ENV=production bundle exec Rails s

そして、私はデータベースから正しい出力を取得しますが、スタイルとログが表示されないページにアクセスします:

ActionController::RoutingError (No route matches [GET] 
"/assets/default.scss-1a27c...f07c.css"):

そのファイルはpublic/assetsに存在しますが

$ ls public/assets/def*
public/assets/default.scss-1a27c...f07c.css     public/assets/default.scss.css
public/assets/default.scss-1a27c...f07c.css.gz  public/assets/default.scss.css.gz

サーバーがアセットファイルを見つけるために何を変更する必要がありますか?

私の他の.cssファイルでも同じことが起こります。それらは指紋で公開/資産にコンパイルされますが、その後は見つかりません。

ページのソースが表示されています:

<link href="/assets/default.scss-1a27c...f07c.css" 
media="screen" rel="stylesheet" type="text/css" />

Rails(haml)ソースは= stylesheet_link_tag 'default.scss.css'

public.assets現在、次のファイルが含まれています。

$ ls public/assets/def*
public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css
public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css.gz
public/assets/default.scss.css
public/assets/default.scss.css.gz

application.rbには

$ cat config/application.rb 
require File.expand_path('../boot', __FILE__)

# Pick the frameworks you want:
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "sprockets/railtie"
# require "Rails/test_unit/railtie"

if defined?(Bundler)
  # If you precompile assets before deploying to production, use this line
  Bundler.require(*Rails.groups(:assets => %w(development test)))
  # If you want your assets lazily compiled in production, use this line
  # Bundler.require(:default, :assets, Rails.env)
end

module Linker
  class Application < Rails::Application
    config.encoding = "utf-8"
    config.filter_parameters += [:password]
    config.assets.enabled = true
    config.assets.initialize_on_precompile = false # For Heroku
    config.assets.version = '1.0'
  end
end

config/environments/productionがあります:

$ cat config/environments/production.rb 
Linker::Application.configure do
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true
  config.assets.precompile += ['default.scss.css','main.css', 'jquery-ui-1.8.22.custom.css']
  config.serve_static_assets = false
  config.assets.compress = true
  config.assets.compile = false
  config.assets.digest = true
  config.log_level = :debug
  config.i18n.fallbacks = true
  config.active_support.deprecation = :notify
end

これはすべてのアセットで発生しているようです。

Started GET "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css"):
Started GET "/assets/main-6864687b4114a1c316e444bd90f233ff.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/main-6864687b4114a1c316e444bd90f233ff.css"):
Started GET "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css"):
Started GET "/assets/application-fc1d492d730f2a45581a40eac4607db8.js" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/application-fc1d492d730f2a45581a40eac4607db8.js"):
Started GET "/images/link.ico" for 127.0.0.1 at 2014-02-23 10:24:48 -0500
ActionController::RoutingError (No route matches [GET] "/images/link.ico"):
27
Michael Durrant

デフォルトでは、Railsはpublicの下のアセットを提供しません。 production.rbをご覧ください:

  config.serve_static_assets = true

これをtrueに変更すると、準備完了です。 (注:本番環境ではtrueにしたくないので、デプロイする前に元に戻すことを忘れないでください!)

詳細については、 Configuring Rails Applications を参照してください。

Rails 6で、デフォルトのproduction.rbには行が必要です

config.public_file_server.enabled = ENV['Rails_SERVE_STATIC_FILES'].present?

だからあなたのサーバーを実行します

Rails_SERVE_STATIC_FILES=true Rails server -e production

またはconfig.public_file_server.enabled=trueproduction.rbを設定します。 Rails 4および5。

31
awendt

Rails 5のソリューションは、上記のJules Copelandによって与えられた Rails 4のソリューション に似ています。

事前に生成されたconfig/environments/production.rbファイルには、次のようなエントリが必要です。

# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.public_file_server.enabled = ENV['Rails_SERVE_STATIC_FILES'].present?

http://guides.rubyonrails.orgConfiguring Rails Applications guide )でこの設定の適切な説明を見つけました。

config.public_file_server.enabled configures Rails publicディレクトリから静的ファイルを提供します。このオプションはデフォルトでtrueに設定されていますが、実稼働環境ではサーバーソフトウェア(NGINXやApacheなど) )アプリケーションを実行するために使用する場合は、代わりに静的ファイルを提供する必要があります。ページキャッシングを使用して、パブリックディレクトリの下に存在するファイルを要求します。

結論:本番環境では、RailsサーバーをRails_SERVE_STATIC_FILES=1は、RailsがWebサーバーと同じようにpublic/assetsディレクトリ内のファイルを提供できるようにします。Railsはアプリサーバーであり、 Webサーバー(NGINX、Apacheなど)ほど効率的にこれを行いません。実際のアプリケーションでは、Railsの前に専用のWebサーバーを配置する必要があります。静的アセットのみで、必要に応じてRails動的コンテンツの場合のみ。詳細については、Webサーバーとアプリサーバーの違いについて この記事 を参照してください。

10
Ben Amos

Rails 4では、環境変数を渡すことで、本番環境(ローカルで実行)で表示することができます。

Rails_SERVE_STATIC_FILES=true Rails server -e production

/config/environments/production.rbに次の行がある限り、これは機能するはずです。

config.serve_static_files = ENV ['Rails_SERVE_STATIC_FILES']。present?

9
Jules Copeland

rake assets:precompileを実行すると、アセットはパブリックディレクトリに移動します。これらのファイルがpublic/assets/で見つかるかどうかを確認してください

次のようなものが表示されるはずです。

I, [2014-02-23T20:06:21.853314 #26915]  INFO -- : Writing app_root/public/assets/application-ecd8636fc80ea2b712039c4abc365da9.css