Tidak ada rute yang cocok dengan [GET] / aset

143

Saya memiliki aplikasi Rails yang saya coba uji di lingkungan produksi. Saya berlari RAILS_ENV=production rake assets:precompileyang menghasilkan semua aset saya di / publik / aset. Masalahnya adalah ketika saya memulai aplikasi RAILS_ENV=production rails s thinsaya dengan:

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

File ini ada meskipun di /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css.

Ada pemikiran mengapa saya mendapatkan ini RoutingError?

Kyle Decot
sumber

Jawaban:

230

Dalam mode produksi, Rails tidak akan bertanggung jawab untuk melayani aset statis. Oleh karena itu, Anda mendapatkan kesalahan ini. Thin juga tidak akan melakukannya, karena itu hanya pembungkus di sekitar Rails.

Ini dikendalikan oleh pengaturan ini di config/environments/production.rbdalam aplikasi Anda:

config.serve_static_files = false

Atau dalam Rails 5:

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

Atau disetel ENV['RAILS_SERVE_STATIC_FILES']ke true.

Anda dapat mengatur itu trueatau menggunakan server nyata seperti Apache atau Nginx yang akan melayani aset statis. Saya curiga Pow juga dapat melakukannya.


Jika Anda menggunakan Heroku, mereka merekomendasikan penggunaan rails_12factorpermata yang memungkinkan pengaturan ini secara default. Tempatkan permata ke dalam productiongrup Anda Gemfile, seperti ini:

group :production do
  gem 'rails_12factor'
end
Ryan Bigg
sumber
5
Adakah yang tahu jika ini solusi untuk masalah yang disebutkan ketika menggunakan ke heroku?
Kyle Clegg
Jawaban yang jelas, terima kasih banyak. Saya sampai di halaman ini ketika saya sedang menguji lingkungan produksi menggunakan thinpada mesin pengembangan saya. Saya mengkompilasi aset tetapi application.csskosong dan log server memberikan kesalahan OP.
veritas1
2
Di Rails 4 itu akan menjadi config.serve_static_files. config.serve_static_assetssudah usang dan akan dihapus dalam Rails 5.
sampi
Menyebarkan ke distribusi RHEL, saya belum menyentuh konfigurasi lingkungan default, baru saja menambahkan permata rails_12factor di Rails v4.2.4, sekarang semuanya baik-baik saja. Terima kasih banyak
Onur Kucukkece
1
@Onur: Ini berarti aplikasi Rails Anda akan melayani aset, bukan server web Anda. Saya tidak merekomendasikan konfigurasi ini sama sekali karena dapat membuat server Rails Anda lebih lambat.
Ryan Bigg
12

Menambah apa yang dikatakan Ryan di atas, panduan jalur pipa aset Rails menjelaskan cara mengatur Apache atau nginx untuk melayani aset statis untuk Anda.

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

Anda benar-benar harus mengatur nginx atau Apache untuk melayani aset statis, karena mereka jauh lebih baik dioptimalkan untuk tugas ini daripada mongrel / thin / unicorn.

bratsche
sumber
7

Baru saja memecahkan masalah yang sama. Dalam kasus saya, jawaban Ryan tidak membantu. Bratsche menunjuk ke Rails Guides, sayangnya ini tidak berhasil untukku juga. Namun sumber daya sangat membantu. Jadi saya mengambil konfigurasi Nginx dari sana dan menambahkan direktif root , menunjuk ke direktori publik. Tanpa ini tidak akan berhasil.

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

     add_header ETag "";
     break;
   }

Mulai ulang nginx, dan hanya itu.

Valk
sumber
3

Memang Anda tidak perlu mengubah konfigurasi default apa pun. Anda baru mengkompilasi ulang file aset lagi .

menghapus publik / aset

1.make aset: clobber RAILS_ENV = produksi

kompilasi aset

2.make aset: mengkompilasi ulang RAILS_ENV = produksi

3. mulai kembali server, mis. (Nginx)

Albert
sumber
@ SteveO7, jelas, rel menggunakan pipleline aset dalam mode dev secara default.
Albert.Qing
2

Rails 4.2 telah menambahkan / mengubah baris ini di file config / environment / staging.rb dan production.rb Anda:

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

Jika RAILS_SERVE_STATIC_FILES tidak disetel, dan Anda adalah aset layanan dari server Rails Anda (seperti dengan Unicorn), maka defaultnya adalah "false", dan RoutingError akan terjadi.

Ini adalah perbaikan yang mudah:

config.serve_static_files = true
Martin Sommer
sumber
Terima kasih, ini pilihan paling sederhana. Konfigurasi biasanya tergantung pada lingkungan server dan membuatnya dapat dikonfigurasi dengan variabel env bagus.
akostadinov
2

Di rel 5, config.serve_static_filesopsi telah berubah, jadi sekarang Anda harus memilikinya

config.public_file_server.enabled = true

untuk melayani aset secara lokal.

Obromio
sumber
2

coba kode di bawah ini:

config / environment / production.rb

config.assets.compile = true

lalu jalankan perintah:

RAILS_ENV=production rake assets:precompile

kemudian dorong semua file kompilasi dan manifes file ke server.

puneet18
sumber
1

Saya menggunakan mina + puma + nginx untuk menggunakan aplikasi Rails 5 saya, saya dapat

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

periksa config / environment / 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 sudah menangani ini , konfigurasikan dengan benar

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

semuanya akan bekerja dengan baik.

Feuda
sumber
1

Jika seseorang datang ke sini dengan kesalahan yang sama di lingkungan pengujian seperti yang saya lakukan, inilah yang membantu saya:

rails assets:clobber assets:precompile RAILS_ENV=test

kemudian:

ps axu | grep your-username

untuk menemukan spring serverproses dan PID-nya, lalu bunuh melalui:

kill <spring-server-PID>
ToTenMilan
sumber