Rails 4:アセットが本番環境に読み込まれない


116

アプリを本番環境に配置しようとしていますが、画像とCSSアセットパスが機能していません。

これが私が現在やっていることです:

  • 画像アセットは/app/assets/images/image.jpgにあります
  • スタイルシートは/app/assets/stylesheets/style.cssにあります
  • 私のレイアウトでは、次のようにcssファイルを参照しています。 <%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
  • ユニコーンを再起動する前に、実行するRAILS_ENV=production bundle exec rake assets:precompileと成功し、public/assetsディレクトリにフィンガープリントされたファイルが表示されます。

私のサイトを閲覧すると、の404 not foundエラーが表示されmysite.com/stylesheets/styles.cssます。

何が悪いのですか?

更新: 私のレイアウトでは、次のようになります:

<%= stylesheet_link_tag    "bootstrap.min", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag    "styles", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>

生成ソースはこれです:

<link data-turbolinks-track="true" href="/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/stylesheets/styles.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-0c647c942c6eff10ad92f1f2b0c64efe.js"></script>

Railsがコンパイル済みのcssファイルを適切に検索していないようです。しかし、JavaScriptで正しく機能する理由は非常に混乱てい/assets/****.jsます(パスに注意してください)。


cssファイルの読み込み方法を教えてください。エラーから、を使用するのではなくハードリンクしようとしたようですstylesheet_link_tag
kik 2013

1
上記に追加されました。私がやっています<%= stylesheet_link_tag "style", media: "all", "data-turbolinks-track" => true %>
emersonthis

わかりましたので、2つのことをお勧めします。1。この行がへのパスとして書き込まれている場合は、生成されたソースをチェックインしますpublic/assets。2。そのcssファイルをロードしようとしている他の命令がないかどうかをダブルチェックします(おそらくハードコードされています)
kik

.erbの使用に問題があるかどうかはわかりませんが、.home {background: #FFF url(<%= image_path 'hippopotamus.jpg' %>) no-repeat; }実際にはスプロケットでと置き換えることができ.home {background: #FFF url(image-path('hippopotamus.jpg')) no-repeat; }ます。これが役立つ場合は、試してみてください。
kik

.erb拡張子を追加せずに、CSSファイルでその参照を動的にできると言っていますか?開発モードのときにリンクを切断したくなかったため、変更しました。
emersonthis

回答:


105

Rails 4では、以下の変更を行う必要があります。

config.assets.compile = true
config.assets.precompile =  ['*.js', '*.css', '*.css.erb'] 

これでうまくいきます。次のコマンドを使用してアセットをプリコンパイルします

RAILS_ENV=production bundle exec rake assets:precompile

がんばって!


11
config.assets.compileをtrueに設定すると、本番環境でのパフォーマンスが低下すると考えました。また、css.erb?誰がそれを使うの?そして、サスとコーヒーはどうですか?
ahnbizcad 2014

coffeeおよびsassファイルが要求されると、それらはcoffee-scriptおよびsass-rails gemによって提供されるプロセッサーによって処理され、それぞれJavaScriptおよびCSSとしてブラウザーに送り返されます。
Rameshwar Vyevhare 2014

1
この問題はすでにRails 4で解決されているため、turbo-sprocket-rails3 gemを使用する必要はありません
Rameshwar Vyevhare

4
申し訳ありませんが、私の質問に答えるためにあなたが言ったことを関連付けることができません。
ahnbizcad 2014

1
通常、本番サーバーを実行するときは、Apacheまたはnginxウェブサーバーの背後でパッセンジャーまたはユニコーンまたはピューマを使用してRailsを実行します。Apacheまたはnginxで静的ファイル(js、css、画像)を提供し、Railsアプリケーションサーバー(puma、unicorn)でRailsコードとテンプレートを提供することをお勧めします。これを行うには、をオフにしconfig.serve_static_files、Apacheおよびnginxでエイリアスを設定してを処理する必要がありassetsます。
チャウHONGたLiNH

85

私は同じ問題を抱えていて、config / environments / production.rbでこの設定を見つけました:

# Rails 4:
config.serve_static_assets = false

# Or for Rails 5:
config.public_file_server.enabled = false

に変更 trueて機能させる。デフォルトでは、RailsはファイルをRailsアプリにプロキシする代わりに、パブリックフォルダーからのファイルのリクエストを処理するようにフロントエンドWebサーバーを構成することを期待しているようです。多分あなたはあなたのJavaScriptファイルのためにこれをしましたが、CSSスタイルシートのためではありませんか?

Rails 5のドキュメントを参照してください)。コメントで述べたように、Rails 5 RAILS_SERVE_STATIC_FILESでは、デフォルト設定がであるため、環境変数を設定するだけで済みますconfig.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?


1
非推奨の警告:構成オプションのconfig.serve_static_assets名前がに変更さconfig.serve_static_filesれ、その役割が明確になりました(publicフォルダー内のすべてを提供できるようにするだけで、アセットパイプラインとは関係ありません)。serve_static_assetsエイリアスは、Railsの5.0に削除されます。それに応じて構成ファイルを移行してください。
yekta

以前にこの問題に直面していたときに、その行を変更すると問題が解決しましたが、今は再び問題に直面しています(これらの状況でどのようになってしまうのかわかりません)。これでは十分ではありません。何が間違っているのかについて他に提案はありますか?
IIllIIll 2015年

2
これは受け入れられる答えになるはずです。それはだけどconfig.serve_static_filesレールに4.2config.public_file_server.enabledRailsの中に5。@see github.com/heroku/rails_serve_static_assets/blob/master/lib/...
ルーカス・ネルソン

3
Rails 5.0.0.1のconfig / environments / production.rbにはconfig.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?、SCMにチェックインされているコードを変更せずに、環境に合わせてこれを異なる方法で設定できるようになっています。
tobinjim

有効にするには: "export RAILS_SERVE_STATIC_FILES ="次に "rails s -e production"を実行します。無効にするには: "unset RAILS_SERVE_STATIC_FILES"
Alfredo Osorio

32

これ/config/environments/production.rbを追加する必要がありました:

Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )

.jsは既にプリコンパイルされていましたが、とにかく追加しました。.cssと.css.erbは明らかに自動的には発生しません。^[^_]コンパイルされているから除外パーシャル-それは正規表現です。

アセットパイプラインがデフォルトで有効になっていることをドキュメントが明確に述べているが、JavaScriptにのみ適用されるという事実を明確にしていないことは少しイライラします。


config.assets.precompileにstyles.cssを追加する必要があります
Frederick Cheung

23

:私は変更することで、この問題を解決することができた config.assets.compile = false
config.assets.compile = trueでは/config/environments/production.rb

更新(2018年6月24日):この方法では使用しているSprocketsのバージョンが2.12.5、3.7.2、または4.0.0.beta8未満の場合にセキュリティの脆弱性が生じます


7
これは、RailsがアセットをCDNからロードするのではなく、コンパイルすることを意味するのではないですか?
ベンジャミンオークス2014年

@BenjaminOakesはい、そしてそれが私が欲しかったものです
Yanofsky

2
このモードは、より多くのメモリを使用し、デフォルトよりもパフォーマンスが低下するため、お勧めしません。nginxプロキシを使用することをお勧めします。
yekta

16

Rails 5では、次の構成コードを有効にする必要があります。

config.public_file_server.enabled = true

デフォルトでは、Rails 5には次の設定行が含まれています。

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

したがって、環境変数RAILS_SERVE_STATIC_FILESをtrue に設定する必要があります。


1
Rails 5については、追加する必要がありpassenger_env_var RAILS_SERVE_STATIC_FILES true;ます。nginx.confファイルのアプリのロケーションブロックに設定します。
マーティンベレス

10

本番環境でアセットを提供するには、2つのことを実行する必要があります。

  1. アセットをプリコンパイルします。
  2. サーバー上のアセットをブラウザーに提供します。

1)アセットをプリコンパイルするには、いくつかの選択肢があります。

  • あなたは実行することができrake assets:precompile、その後、ソースコード管理(gitの)にそれをコミットし、ローカルマシン上の例のカピストラーノため、導入プログラムを実行します。これは、プリコンパイル済みのアセットをSCMにコミットするのに適した方法ではありません。

  • RAILS_ENV=production rake assets:precompileサーバーを再起動する前に、Railsアプリを本番環境にデプロイするたびにターゲットサーバーで実行されるrakeタスクを作成できます。

capistranoのタスクのコードは次のようになります。

on roles(:app) do
  if DEPLOY_ENV == 'production'
    execute("cd #{DEPLOY_TO_DIR}/current && RAILS_ENV=production rvm #{ruby_string} do rake assets:precompile")
  end
end

2)これで、運用サーバーに資産ができたので、それらをブラウザーに提供する必要があります。

繰り返しますが、いくつかの選択肢があります。

  • config / environments / production.rbで提供されるRails静的ファイルをオンにする

    config.serve_static_assets = true # old
    
    or
    
    config.serve_static_files = true # new

    Railsを使用して静的ファイルを提供すると、Railsアプリのパフォーマンスが低下します。

  • 静的ファイルを提供するようにnginx(またはApache)を構成します。

    たとえば、Pumaで動作するように構成された私のnginxは次のようになります。

    location ~ ^/(assets|images|fonts)/(.*)$ {
        alias /var/www/foster_care/current/public/$1/$2;
        gzip on;
        expires max;
        add_header Cache-Control public;
    }

4

Rails 4は、フィンガープリントされていないバージョンのアセットを生成しなくなりました。stylesheets/ style.cssは生成されません。

使用するstylesheet_link_tagと、スタイルシートへの正しいリンクが生成されます

またstyles.cssにする必要がありますconfig.assets.precompileプリコンパイルされているもののリストであります


/ public / assets /ディレクトリにフィンガープリントされたファイルがあります。私のレイアウトでは、これがあります:<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>これは間違っていますか? `
emersonthis

なんらかの理由で、ソースを表示したときにプロダクションデプロイメントがまだ元のファイルを指してい<link data-turbolinks-track="true" href="https://stackoverflow.com/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />ますが、JavaScriptファイルは正しいです!同じ構成が.jsファイルでは機能するが.cssでは機能しない理由がわかりません。
emersonthis 2013

Rails 5.0.0.beta3では、次の警告が表示されます:DEPRECATION WARNING:serve_static_filesは非推奨であり、Rails 5.1では削除されます。public_file_server.enabled = true代わりに使用してください。
GMA 2016年

@emersonthis同じ!Jsは完全にロードしますが、一部のcssファイルは取得し404ます。これを解決しましたか?
IvRRimUm 2017

これは、常にアセットパイプラインの構成に関する問題です。デフォルトではない任意の場所にファイルがある場合、それはほぼ間違いなく問題であり、最初の回答のようなものを使用してアセットパイプラインにそのことを伝える必要があります。
emersonthis 2017

3

Production.rbファイルの行を変更する

config.assets.compile = false

config.assets.compile = true

また追加

config.assets.precompile =  ['*.js', '*.css', '*.css.erb']

なぜコンパイルするのですか?稼働中に本番環境でコンパイルすると仮定します
James Tan

1
絶対にしないでください!本番環境でconfig.assets.compileをtrueに設定する人は誰でも撃たれるべきです。
bkunzi01

2

Ubuntu Server 14.04Ruby 2.2.1、およびRails 4.2.4を実行しています。DigitalOceanからのデプロイトゥロリアルに従いましたが、すべてうまくいきましたが、ブラウザーに移動してVPSのIPアドレスを入力すると、アプリが読み込まれますが、スタイルとJavaScript。

アプリはUnicornNginxで実行されています。この問題を解決するには、ユーザー'deployer'で SSHを使用してサーバーにアクセスし、'/ home / deployer / apps / blog'であるアプリのパスに移動して、次のコマンドを実行します。

RAILS_ENV=production bin/rake assets:precompile

次に、VPSを再起動するだけです。わたしにはできる!

それが他の誰かに役立つことを願っています!


2

プリコンパイルが設定されている場合は必要ありません

config.assets.compile = true

これは、アセットをライブで提供するためです。

私たちの問題は、開発秘密鍵ベースのみが設定されていたことでした。 config/secrets.yml

development:
    secret_key_base: '83d141eeb181032f4070ae7b1b27d9ff'

本番環境へのエントリーが必要


1
あなたが必要とする他の回答で述べたようにconfig.assets.precompile = ['*.js', '*.css', '*.css.erb'] して実行するRAILS_ENV=production bundle exec rake assets:precompile
xxjjnn

1
これにより、制作中のアセットのコンパイルが可能になります。非常に遅く、正しくありません
James Tan

2

してはいけないこと:

上記の私の同僚の何人かはこれを行うことをあなたに勧めました:

config.serve_static_assets = true  ## DON”T DO THIS!! 
config.public_file_server.enabled = true ## DON”T DO THIS!!

Railsアセットパイプラインは、上記のアプローチについて述べています。

このモードは、より多くのメモリを使用し、デフォルトよりもパフォーマンスが低下するため、お勧めしません。ここを参照してください:(http://edgeguides.rubyonrails.org/asset_pipeline.html#live-compilation

あなたがすべきこと:

アセットをプリコンパイルします。

RAILS_ENV=production rake assets:precompile

あなたはおそらくレーキタスクでそれを行うことができます。


なぜビルドアーティファクトをGitに追加するのですか?あなただけの(そのあなたがすべき、あなたがuglifierを持っており、上gzipping場合は特に)、ビルドプロセスにrakeタスクを追加し、大規模なgitspamを回避することができます
Dr.Strangelove

@ Dr.Strangeloveコメントありがとうございます-それについてはよくわかりません-:元の投稿を詳しく説明/編集できますか?
BKSpurgeon

1

ファイルをコンパイルするためのデフォルトのマッチャーには、gemを含むapp / assetsフォルダーからのapplication.js、application.css、およびすべての非JS / CSSファイル(すべての画像アセットが自動的に含まれます)が含まれます。

含める他のマニフェストまたは個別のスタイルシートとJavaScriptファイルがある場合は、それらをconfig / initializers / assets.rbのプリコンパイル配列に追加できます。

Rails.application.config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']

http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets


1

まず、アセットを確認してください。アセットのプリコンパイルでエラーが発生している可能性があります。

本番環境のENVでアセットをプリコンパイルするには、次のコマンドを実行します。

RAILS_ENV=production rake assets:precompile

エラーが表示された場合は、まず削除してください。

「未定義の変数」エラーの場合、別のファイルで使用する前に、その変数ファイルをロードします。

例:

@import "variables";
@import "style";

application.rbファイルセットのアセットの事前コンパイルのシーケンス

例:

config.assets.precompile += [ 'application.js', 'admin.js', 'admin/events.js', 'admin/gallery.js', 'frontendgallery.js']

config.assets.precompile += [ 'application.css', 'admin.css','admin/events.css', 'admin/gallery.css', 'frontendgallery.css']

1

これが見つかりました:

構成オプションconfig.serve_static_assetsconfig.serve_static_files、その役割を明確にするために名前が変更されました。

config/environments/production.rb

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

したがって、env RAILS_SERVE_STATIC_FILESまたはusing Nginxを設定して静的ファイルを提供します。追加config.serve_static_assets = trueは引き続き機能しますが、将来は削除されます。


1

capistranoにアセットをプリコンパイルさせることはお勧めできません。これは、時間がかかり、多くの場合タイムアウトになる可能性があるためです。ローカルアセットをプリコンパイルしてみてください。

1つ目は、config / application.rbで設定 config.assets.initialize_on_precompile = false し、ローカルで実行します。 RAILS_ENV=production bin/rake assets:precompile で実行し、これらのpublic / assetsをgitに追加します。

およびconfig / environments / development.rbで、プリコンパイル済みアセットの使用を回避するようにアセットパスを変更します。

config.assets.prefix = '/dev-assets'

db接続の問題がある場合は、dbを使用するイニシャライザがあることを意味します。それを回避する1つの方法は、production.rbをproduction2 .rb として複製することで新しい環境を設定し、database.ymlに、開発 DB設定でproduction2環境を追加することです。それから

RAILS_ENV=production2 bin/rake assets:precompile

アセット(たとえば、ckeditor)でまだ問題が発生している場合は、jsファイルをconfig / initializers / assets.rbに追加します

Rails.application.config.assets.precompile += %w( ckeditor.js )


0

私は間違っているかもしれませんが、変更をお勧めする人

config.assets.compile = true

この行のコメントは次のとおりです。#プリコンパイルされたアセットがない場合は、アセットパイプラインにフォールバックしないでください。

これは、これをtrueに設定することにより、問題を修正するのではなく、毎回それをバイパスしてパイプラインを実行することを示唆しています。これは確かにあなたのパフォーマンスを殺し、パイプラインの目的を打ち負かす必要がありますか?

これと同じエラーが発生しました。これは、railsが認識していないサブフォルダーで実行されているアプリケーションが原因でした。

だから私のcssファイルはhome / subfolder / app / public / ....にありますが、railsはhome / app / public / ...を探していました

アプリをサブフォルダーの外に移動するか、アプリがサブフォルダーにあることをRailsに伝えてみてください。


0
location ~ ^/assets/ {
  expires 1y;
  add_header Cache-Control public;
  add_header ETag "";
}

これにより、本番環境での問題が修正されました。nginx設定に入れます。


0

私たちはRAILS_ENV=production bundle exec rake assets:precompile成功した同じ問題に直面しましたが、物事は期待どおりに機能しませんでした。
ここではユニコーンが主な犯人であることがわかりました。

あなたの場合と同じですが、アセットをコンパイルした後にユニコーンを再起動していました。ユニコーンを再起動すると、そのワーカープロセスのみが再起動され、マスタープロセスは再起動されないことがわかりました。
これが、正しいアセットが提供されない主な理由です。

その後、アセットをコンパイルした後、ユニコーンを停止して開始しました。これにより、ユニコーンマスタープロセスも再起動され、正しいアセットが提供されました。
ユニコーンを停止して開始すると、ユニコーンを再起動する場合と比較して、ダウンタイムに約10秒かかります。これは、長期的な解決策がユニコーンからピューマに移行する場合に使用できる回避策です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.