web-dev-qa-db-ja.com

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

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

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

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

RoutingErrorを取得している理由についての考え

135
Kyle Decot

実稼働モードでは、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のような静的アセットを提供する実サーバーを使用できます。 Powもそれをするかもしれないと思う。


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

group :production do
  gem 'Rails_12factor'
end
220
Ryan Bigg

ライアンが上記に述べたことに加えて、Railsアセットパイプラインガイドでは、Apacheまたはnginxをセットアップして静的アセットを提供する方法について説明しています。

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

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

12
bratsche

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

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

     add_header ETag "";
     break;
   }

Nginxを再起動してください。

6
valk

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

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

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

資産コンパイル

2. rakeアセット:プリコンパイルRails_ENV = production

3.サーバーの再起動、例(nginx)

3
Albert.Qing

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
2
Martin Sommer

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

config/environments/production.rb

config.assets.compile = true

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

Rails_ENV=production rake assets:precompile

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

2
puneet18

Rails 5では、config.serve_static_filesオプションが変更されたため、次が必要です。

config.public_file_server.enabled = true

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

2
Obromios

テスト環境で私と同じエラーで誰かがここに来た場合、私が助けたのは次のとおりです:

Rails assets:clobber assets:precompile Rails_ENV=test

その後:

ps axu | grep your-username

spring serverプロセスと彼のPIDを見つけて、次の方法で強制終了します。

kill <spring-server-PID>
0
ToTenMilan

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;
}

物事はうまくいきます。

0
Feuda