一致するルートはありません[GET] / assets


143

実稼働環境でテストしようとしているRailsアプリがあります。RAILS_ENV=production rake assets:precompileすべてのアセットを/ public / assetsに生成して実行しました。問題は、私がアプリを起動するRAILS_ENV=production rails s thinと次のようになることです:

ActionController::RoutingError (No route matches [GET] "/assets/application-eff78fd67423795a7be3aa21512f0bd2.css"):

このファイルはにも存在します/public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css

なぜ私はこれを手に入れているのRoutingErrorですか?

回答:


230

プロダクションモードでは、Railsは静的アセットの提供を担当しません。したがって、このエラーが発生します。ThinはRailsのラッパーにすぎないため、これも実行しません。

これはconfig/environments/production.rb、アプリケーションの次の設定によって制御されます。

config.serve_static_files = false

またはRails 5では:

# config/environments/production.rb
config.public_file_server.enabled = true

またはENV['RAILS_SERVE_STATIC_FILES']、trueに設定します。

これに設定するかtrue、静的アセットを提供するApacheやNginxなどの実サーバーを使用できます。パウもそれをするかもしれないと思います。


Herokuを使用している場合、rails_12factorこの設定をデフォルトで有効にするgem の使用を推奨しています。次のように、宝石をのproductionグループに配置しますGemfile

group :production do
  gem 'rails_12factor'
end

5
これがherokuにデプロイするときの上記の問題の解決策であるかどうか誰でも知っていますか?
カイルクレッグ2013

明確な答え、どうもありがとう。thin開発マシンで本番環境をテストしているときにこのページに移動しました。アセットをコンパイルしていましたapplication.cssが、空でサーバーログにOPのエラーが表示されました。
veritas1 2013

2
Rails 4ではそうなりますconfig.serve_static_filesconfig.serve_static_assets廃止されており、レール5で削除される予定
sampi

RHELディストリビューションにデプロイするときは、デフォルトの環境設定には触れていません。Railsv4.2.4にrails_12factor gemを追加しただけで、すべてが順調です。
どうも

1
@Onur:これは、RailsアプリケーションがWebサーバーではなくアセットを提供することを意味します。Railsサーバーの速度が低下する可能性があるため、この構成はお勧めしません。
Ryan Bigg

12

上記のライアンの発言に加えて、Railsアセットパイプラインガイドでは、Apacheまたはnginxを設定して静的アセットを提供する方法を説明しています。

http://guides.rubyonrails.org/asset_pipeline.html

静的アセットを提供するようにnginxまたはApacheを設定する必要があります。これらはmongrel / thin / unicornよりもこのタスクに最適化されているためです。


7

ちょうど同じ問題を解決しました。私の場合、ライアンの答えは役に立ちませんでした。BratscheはRailsガイドを指摘しましたが、残念ながらこれは私にとってもうまくいきませんでした。しかし、リソースは役に立ちました。そこで、そこからNginxの構成を取得し、パブリックディレクトリを指すルートディレクティブを追加しました。これがないと動作しません。

   # serve static assets
   location ~ ^/assets/ {
     expires 1y;
     root  /path/to/my/cool_project/public;
     add_header Cache-Control public;

     add_header ETag "";
     break;
   }

nginxを再起動すると、それだけです。


3

実際、デフォルトの設定を変更する必要はありませんでした。資産ファイルを再コンパイルするだけです

パブリック/アセットを削除する

1.rakeアセット:clobber RAILS_ENV = production

アセットのコンパイル

2.レーキアセット:プリコンパイルRAILS_ENV = production

3.サーバーを再起動します(eg(nginx))


@ SteveO7、明らかに、railsはデフォルトで開発モードでアセットpiplelineを使用します。
Albert.Qing 2016

2

Rails 4.2は、config / environments / staging.rbおよびproduction.rbファイルに次の行を追加/変更しました。

config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?

RAILS_SERVE_STATIC_FILESが設定されておらず、Railsサーバーからのサービスアセットである場合(Unicornなど)、デフォルトは "false"になり、RoutingErrorが発生します。

これは簡単な修正です。

config.serve_static_files = true

おかげで、これは最も簡単なオプションです。設定は通常サーバー環境に依存し、env-variableで設定可能にするのは素晴らしいことです。
akostadinov

2

Rails 5では、config.serve_static_filesオプションが変更されたので、今必要なのは

config.public_file_server.enabled = true

ローカルでアセットを提供する。


2

以下のコードを試してください:

config / environments / production.rb

config.assets.compile = true

次にコマンドを実行します:

RAILS_ENV=production rake assets:precompile

次に、すべてのコンパイルファイルとマニフェストファイルをサーバーにプッシュします。


1

Mina + Puma + Nginxを使用してRails 5アプリケーションをデプロイしました。

ActionController::RoutingError (No route matches [GET] "/assets/application-658cf2ab3ac93aa5cb41a762b52cf49d7184509c307922cd3fbb61b237a59c1a.css")

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?

NGINXはすでにこれを処理し、正しく構成します

upstream puma {
  server unix:///home/deploy/apps/appname/shared/tmp/sockets/appname-puma.sock;
}

server {
  listen 80 default_server deferred;
  # server_name example.com;

  root /home/deploy/apps/appname/current/public;
  access_log /home/deploy/apps/appname/current/log/nginx.access.log;
  error_log /home/deploy/apps/appname/current/log/nginx.error.log info;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @puma;
  location @puma {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    proxy_pass http://puma;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 10M;
  keepalive_timeout 10;
}

物事はうまくいきます。


1

テスト環境で誰かが私と同じエラーでここに来た場合、以下が私を助けました:

rails assets:clobber assets:precompile RAILS_ENV=test

次に:

ps axu | grep your-username

spring serverプロセスと彼のPID を見つけるには、次のようにして強制終了します。

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