Żadna trasa nie pasuje do [GET] / asset

143

Mam aplikację Rails, którą próbuję przetestować w środowisku produkcyjnym. Uruchomiłem, RAILS_ENV=production rake assets:precompilektóry wygenerował wszystkie moje aktywa w / public / asset. Problem polega na tym, że po uruchomieniu aplikacji RAILS_ENV=production rails s thinotrzymuję:

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

Ten plik istnieje jednak pod adresem /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css .

Jakieś przemyślenia, dlaczego to rozumiem RoutingError?

Kyle Decot
źródło

Odpowiedzi:

230

W trybie produkcyjnym Railsy nie będą odpowiedzialne za obsługę statycznych zasobów. Dlatego otrzymujesz ten błąd. Thin też tego nie zrobi, ponieważ to tylko opakowanie wokół Railsów.

Jest to kontrolowane przez to ustawienie config/environments/production.rbw Twojej aplikacji:

config.serve_static_files = false

Lub w Rails 5:

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

Lub ustawione ENV['RAILS_SERVE_STATIC_FILES']na prawdę.

Możesz to ustawić truelub użyć prawdziwego serwera, takiego jak Apache lub Nginx, który będzie obsługiwał statyczne zasoby. Podejrzewam, że Pow może to zrobić.


Jeśli jesteś na Heroku, zalecają użycie rails_12factorklejnotu, który domyślnie włącza to ustawienie. Umieść klejnot w productiongrupie w swoim Gemfile, w ten sposób:

group :production do
  gem 'rails_12factor'
end
Ryan Bigg
źródło
5
Czy ktoś wie, czy jest to rozwiązanie wspomnianego problemu podczas wdrażania na heroku?
Kyle Clegg
Jasna odpowiedź, wielkie dzięki. Dotarłem do tej strony, gdy testowałem środowisko produkcyjne thinna mojej maszynie deweloperskiej. Kompilowałem zasoby, ale application.cssbył pusty, a dziennik serwera podał błąd OP.
veritas1
2
W Rails 4 będzie config.serve_static_files. config.serve_static_assetsjest przestarzały i zostanie usunięty w Railsach 5.
sampi
Wdrażając do dystrybucji RHEL, nie dotknąłem domyślnej konfiguracji środowiska, po prostu dodałem gem rails_12factor w Rails v4.2.4, teraz wszystko jest w porządku. Wielkie dzięki
Wielkie Onur Kucukkece
1
@Nur: Oznacza to, że Twoja aplikacja Rails będzie obsługiwać zasoby, a nie serwer WWW. W ogóle nie polecam tej konfiguracji, ponieważ może to spowolnić twój serwer Rails.
Ryan Bigg
12

Dodając do tego, co powiedział Ryan powyżej, przewodnik dotyczący potoku aktywów Rails opisuje, jak skonfigurować Apache lub nginx, aby obsługiwał statyczne zasoby za Ciebie.

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

Naprawdę powinieneś skonfigurować nginx lub Apache, aby obsługiwał zasoby statyczne, ponieważ są one znacznie lepiej zoptymalizowane do tego zadania niż kundel / cienki / jednorożec.

bratsche
źródło
7

Właśnie rozwiązałem ten sam problem. W moim przypadku odpowiedź Ryana nie była pomocna. Bratsche wskazał na prowadnice szyn, niestety to też mi się nie udało. Jednak zasób był pomocny. Więc wziąłem stamtąd konfigurację Nginx i dodałem dyrektywę root , wskazując na katalog publiczny. Bez tego to nie działa.

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

     add_header ETag "";
     break;
   }

Zrestartuj Nginx i to wszystko.

valk
źródło
3

Rzeczywiście, nie trzeba było modyfikować żadnych domyślnych konfiguracji. Po prostu ponownie skompiluj plik zasobów .

usunąć publiczne / aktywa

1. aktywa grabieży: clobber RAILS_ENV = produkcja

kompilacja zasobów

2. aktywa poboru: prekompilacja RAILS_ENV = produkcja

3. zrestartuj serwer, np. (Nginx)

Albert.Qing
źródło
@ SteveO7, oczywiście, railsy domyślnie używają zasobów pipleline w trybie deweloperskim.
Albert. Qing
2

Rails 4.2 dodał / zmienił tę linię w twoich plikach config / environment / staging.rb i production.rb:

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

Jeśli RAILS_SERVE_STATIC_FILES nie jest ustawione, a jesteś zasobem usługowym z serwera Rails (tak jak w przypadku Unicorn), to domyślnie będzie to „false” i wystąpi błąd RoutingError.

To łatwe rozwiązanie:

config.serve_static_files = true
Martin Sommer
źródło
Dzięki, to najprostsza opcja. Konfiguracja zwykle zależy od środowiska serwera i sprawienie, że można ją konfigurować za pomocą zmiennej env, jest fajne.
akostadinov
2

W szynach 5 config.serve_static_filesopcja się zmieniła, więc teraz musisz mieć

config.public_file_server.enabled = true

do obsługi zasobów lokalnie.

Obromios
źródło
2

wypróbuj poniższy kod:

config / environment / production.rb

config.assets.compile = true

następnie uruchom polecenie:

RAILS_ENV=production rake assets:precompile

następnie wypchnij wszystkie kompilowane pliki i plik manifestu na serwer.

puneet18
źródło
1

Używam mina + puma + nginx do wdrożenia mojej aplikacji Rails 5

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

sprawdź 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 już to obsługuje , skonfiguruj to poprawnie

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

wszystko będzie dobrze działać.

Feuda
źródło
1

Jeśli ktoś dostanie się tutaj z tym samym błędem w środowisku testowym co ja, oto co mi pomogło:

rails assets:clobber assets:precompile RAILS_ENV=test

następnie:

ps axu | grep your-username

znaleźć spring serverproces i jego PID, a następnie zabić go za pomocą:

kill <spring-server-PID>
ToTenMilan
źródło