Rota eşleşmesi yok [GET] / öğeler


143

Üretim ortamında test etmeye çalıştığım bir Rails uygulamam var. RAILS_ENV=production rake assets:precompileTüm varlıklarımı / public / varlıklarda üreten koştum . Sorun benim w / benim app başlattığınızda RAILS_ENV=production rails s thinolsun:

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

Bu dosya adresinde var /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css.

Bunu neden aldığım hakkında bir fikrin var RoutingErrormı?

Yanıtlar:


230

Üretim modunda, Rails statik varlıkların sunumundan sorumlu olmayacaktır. Bu nedenle, bu hatayı alıyorsunuz. Thin da yapmayacak, çünkü Rails'in etrafındaki bir sarıcı.

Bu, config/environments/production.rbuygulamanızdaki şu ayar tarafından kontrol edilir :

config.serve_static_files = false

Veya Rails 5'de:

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

Veya ENV['RAILS_SERVE_STATIC_FILES']true olarak ayarlayın .

Buna ayarlayabilir trueveya statik varlıkları sunacak Apache veya Nginx gibi gerçek bir sunucu kullanabilirsiniz. Pow'in de yapabileceğinden şüpheleniyorum.


Heroku kullanıyorsanız rails_12factor, bu ayarı varsayılan olarak etkinleştiren mücevher kullanımını önerirler . Gemini, productioniçindeki bir gruba yerleştirin Gemfile, şöyle:

group :production do
  gem 'rails_12factor'
end

5
Herkes bu heroku için konuşlandırırken söz konusu soruna bir çözüm olup olmadığını biliyor mu?
Kyle Clegg

Açık cevap, çok teşekkürler. thinGeliştirme sayfamı kullanarak üretim ortamını test ederken bu sayfaya geldim . Ben varlıkları derleme ama application.cssboştu ve sunucu günlüğü OP hatası verdi.
veritas1

2
Rails 4'te olacak config.serve_static_files. config.serve_static_assetskullanımdan kaldırıldı ve Rails 5'te kaldırılacak.
sampi

Bir RHEL dağıtımına dağıtıldığında, varsayılan ortam yapılandırmasına dokunmadım, Rails v4.2.4'e rails_12factor gemini ekledim, şimdi her şey yolunda. Çok teşekkürler
Onur Küçükkece

1
@Onur: Bu, Rails uygulamanızın web sunucunuz yerine varlıkları sunacağı anlamına gelir. Bu yapılandırmayı kesinlikle önermiyorum çünkü Rails sunucunuzu yavaşlatabilir.
Ryan Bigg

12

Ryan'ın yukarıda söylediklerine ek olarak, Rails varlık boru hattı kılavuzu, Apache veya nginx'in statik varlıkları sizin için sunacak şekilde nasıl ayarlanacağını açıklar.

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

Nginx veya Apache'yi statik varlıklar sunacak şekilde ayarlamanız gerekir, çünkü bu görev için melez / ince / tek boynuzlu attan çok daha iyi optimize edilmiştir.


7

Sadece aynı problemi çözdüm. Benim durumumda Ryan'ın cevabı yardımcı olmadı. Bratsche, Rails Kılavuzlarına işaret etti, maalesef bu benim için de işe yaramadı. Ancak kaynak yardımcı oldu. Bu yüzden Nginx yapılandırmasını oradan aldım ve kök dizini ekleyerek genel dizini işaret ettim . Bu olmadan işe yaramaz.

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

     add_header ETag "";
     break;
   }

Nginx'i yeniden başlatın ve hepsi bu.


3

Aslında herhangi bir varsayılan yapılandırmayı değiştirmeniz gerekmez. Sadece varlık dosyasını tekrar derlersiniz .

genel / varlıkları kaldır

1. fren varlıkları: clobber RAILS_ENV = üretim

varlık derleme

2.Fren varlıkları: ön derleme RAILS_ENV = üretim

3. sunucuyu yeniden başlatın, örneğin (nginx)


@ SteveO7, açıkça, raylar varsayılan olarak dev modunda varlık pipleline kullanır.
Albert.Qing

2

Rails 4.2, config / çevre / staging.rb ve production.rb dosyalarınıza bu satırı ekledi / değiştirdi:

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

RAILS_SERVE_STATIC_FILES ayarlanmamışsa ve Rails sunucunuzdan (Unicorn gibi) servis varlıklarıysanız, varsayılan olarak "false" olur ve RoutingError oluşur.

Bu kolay bir düzeltme:

config.serve_static_files = true

Teşekkürler, bu en basit seçenektir. Yapılandırma genellikle sunucu ortamına bağlıdır ve bir env değişkeni ile yapılandırılabilir olması güzeldir.
akostadinov

2

Raylarda 5, config.serve_static_filesseçenek değişti, bu yüzden şimdi

config.public_file_server.enabled = true

yerel olarak varlık sunmak.


2

aşağıdaki kodu deneyin:

yapılandırma / ortamlar / production.rb

config.assets.compile = true

sonra komutu çalıştırın:

RAILS_ENV=production rake assets:precompile

sonra tüm derleme dosyalarını ve manifest dosyalarını sunucuya aktarın.


1

Rails 5 uygulamamı dağıtmak için mina + puma + nginx kullanıyorum, aldım

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

yapılandırma / ortamlar / üretim.rb'yi kontrol edin

# 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 bunu zaten ele alıyor , doğru şekilde yapılandırıyor

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

herşey yolunda gidecek.


1

Birisi benim yaptığım test ortamında aynı hatayla buraya gelirse bana yardımcı olan şey:

rails assets:clobber assets:precompile RAILS_ENV=test

sonra:

ps axu | grep your-username

spring serversüreci bulmak ve PID sonra üzerinden öldürmek:

kill <spring-server-PID>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.