it-swarm-id.com

Tidak ada rute yang cocok dengan [GET]/aset

Saya memiliki aplikasi Rails yang saya coba uji di lingkungan produksi. Saya menjalankan Rails_ENV=production rake assets:precompile yang menghasilkan semua aset saya di/publik/aset. Masalahnya adalah ketika saya memulai aplikasi saya dengan Rails_ENV=production Rails s thin saya mendapatkan:

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

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

Adakah pemikiran mengapa saya mendapatkan RoutingError ini?

131
Kyle Decot

Dalam mode produksi, Rails tidak akan bertanggung jawab untuk melayani aset statis. 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.rb di aplikasi Anda:

config.serve_static_files = false

Atau dalam Rails 5:

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

Atau set ENV['Rails_SERVE_STATIC_FILES'] menjadi true.

Anda dapat mengatur true atau 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 permata Rails_12factor yang memungkinkan pengaturan ini secara default. Tempatkan permata ke dalam grup production di Gemfile Anda, seperti ini:

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

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.

12
bratsche

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.

6
valk

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

menghapus publik/aset

1.make aset: clobber Rails_ENV = produksi

kompilasi aset

2.make aset: mengkompilasi Rails_ENV = produksi

3. mulai kembali server, mis. (Nginx)

3
Albert.Qing

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

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 kompilasi file dan manifes file ke server.

2
puneet18

Di Rails 5, opsi config.serve_static_files telah berubah, jadi sekarang Anda harus memilikinya 

config.public_file_server.enabled = true

untuk melayani aset secara lokal.

2
Obromios

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 proses spring server dan PID-nya, lalu bunuh melalui:

kill <spring-server-PID>
0
ToTenMilan

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.

0
Feuda