Próbuję wprowadzić moją aplikację do produkcji, a ścieżki zasobów obrazu i css nie działają.
Oto, co obecnie robię:
- Zasoby graficzne znajdują się w /app/assets/images/image.jpg
- Arkusze stylów znajdują się w /app/assets/stylesheets/style.css
- W moim układzie odwołuję się do pliku css w następujący sposób:
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
- Przed ponownym uruchomieniem jednorożca uruchamiam
RAILS_ENV=production bundle exec rake assets:precompile
i się udaje i widzę pliki z odciskami palców wpublic/assets
katalogu.
Kiedy przeglądam moją witrynę, otrzymuję błąd 404 nie znaleziono dla adresu mysite.com/stylesheets/styles.css
.
Co ja robię źle?
Aktualizacja: W moim układzie wygląda to tak:
<%= stylesheet_link_tag "bootstrap.min", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
Generowane źródło jest następujące:
<link data-turbolinks-track="true" href="/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/stylesheets/styles.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-0c647c942c6eff10ad92f1f2b0c64efe.js"></script>
Wygląda na to, że Railsy nie szukają poprawnie skompilowanych plików css. Ale to bardzo mylące, dlaczego działa poprawnie dla skryptów javascript (zwróć uwagę na /assets/****.js
ścieżkę).
ruby-on-rails
ruby
asset-pipeline
ruby-on-rails-4
emersonthis
źródło
źródło
stylesheet_link_tag
.<%= stylesheet_link_tag "style", media: "all", "data-turbolinks-track" => true %>
public/assets
i 2. sprawdź, czy nie ma gdzieś innej instrukcji próbującej załadować ten plik css (prawdopodobnie zakodowany na.home {background: #FFF url(<%= image_path 'hippopotamus.jpg' %>) no-repeat; }
rzeczywistości można go wymienić w zębatce na.home {background: #FFF url(image-path('hippopotamus.jpg')) no-repeat; }
. Może spróbuj, jeśli to pomoże.Odpowiedzi:
W szynach 4 musisz wprowadzić poniższe zmiany:
To działa ze mną. użyj następującego polecenia, aby wstępnie skompilować zasoby
Powodzenia!
źródło
config.serve_static_files
i skonfigurować alias w Apache i nginxassets
.Właśnie miałem ten sam problem i znalazłem to ustawienie w config / environment / production.rb:
Zmieniam to na
true
działało. Wygląda na to, że domyślnie Railsy oczekują, że skonfigurujesz swój serwer frontonu do obsługi żądań plików z folderu publicznego zamiast przekazywania ich do aplikacji Rails. Być może zrobiłeś to dla swoich plików javascript, ale nie dla arkuszy stylów CSS?( Zobacz dokumentację Rails 5 ). Jak zauważono w komentarzach, w Railsach 5 możesz po prostu ustawić
RAILS_SERVE_STATIC_FILES
zmienną środowiskową, ponieważ domyślnym ustawieniem jestconfig.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
.źródło
config.serve_static_assets
nazwę opcji konfiguracji na,config.serve_static_files
aby wyjaśnić jej rolę (umożliwia jedynie obsługę wszystkiego wpublic
folderze i nie jest związana z potokiem zasobów).serve_static_assets
Ps zostaną usunięte w szynach 5,0. Przeprowadź odpowiednią migrację plików konfiguracyjnych.config.serve_static_files
w Rails 4.2 iconfig.public_file_server.enabled
Rails 5 . @see github.com/heroku/rails_serve_static_assets/blob/master/lib/…config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
więc możesz ustawić to inaczej dla swojego środowiska bez zmiany kodu, który jest wpisany do SCM.W
/config/environments/production.rb
musiałem to dodać:.Js był już prekompilowany, ale i tak go dodałem. Najwyraźniej pliki .css i .css.erb nie pojawiają się automatycznie. W
^[^_]
wyklucza partials z kompilowane - to wyrażenie regularne.To trochę frustrujące, że dokumentacja jasno stwierdza, że potok aktywów jest domyślnie włączony, ale nie wyjaśnia faktu, że dotyczy to tylko skryptów JavaScript.
źródło
Udało mi się rozwiązać ten problem poprzez zmianę:
config.assets.compile = false
doconfig.assets.compile = true
IN/config/environments/production.rb
Aktualizacja (24 czerwca 2018 r.) : Ta metoda tworzy lukę w zabezpieczeniach, jeśli używana wersja Sprockets jest niższa niż 2.12.5, 3.7.2 lub 4.0.0.beta8
źródło
Dla Rails 5 powinieneś włączyć następujący kod konfiguracyjny:
config.public_file_server.enabled = true
Domyślnie Rails 5 są dostarczane z następującą linią konfiguracji:
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
Dlatego musisz ustawić zmienną środowiskową
RAILS_SERVE_STATIC_FILES
na true.źródło
passenger_env_var RAILS_SERVE_STATIC_FILES true;
w bloku lokalizacji mojej aplikacji w moim pliku nginx.conf.Aby obsłużyć zasoby w produkcji, musisz wykonać 2 rzeczy:
1) Aby wstępnie skompilować zasoby, masz kilka możliwości.
Możesz uruchomić
rake assets:precompile
na komputerze lokalnym, zatwierdzić go do kontroli kodu źródłowego (git), a następnie uruchomić program wdrożeniowy, na przykład capistrano. To nie jest dobry sposób przekazywania wstępnie skompilowanych zasobów do SCM.Możesz napisać zadanie rake, które będzie uruchamiane
RAILS_ENV=production rake assets:precompile
na serwerach docelowych za każdym razem, gdy wdrażasz aplikację Rails w środowisku produkcyjnym, zanim zrestartujesz serwer.Kod w zadaniu dla Capistrano będzie wyglądał podobnie do tego:
2) Teraz masz zasoby na serwerach produkcyjnych, musisz je udostępnić przeglądarce.
Ponownie masz kilka możliwości.
Włącz obsługę plików statycznych Railsów w config / environment / production.rb
Używanie Railsów do obsługi plików statycznych może obniżyć wydajność Twojej aplikacji Railsowej.
Skonfiguruj nginx (lub Apache) do obsługi plików statycznych.
Na przykład mój nginx, który został skonfigurowany do pracy z Pumą, wygląda następująco:
źródło
Rails 4 nie generuje już wersji zasobu bez odcisku palca: arkusze stylów / style.css nie będą generowane dla Ciebie.
Jeśli użyjesz,
stylesheet_link_tag
zostanie wygenerowany poprawny link do twojego arkusza stylówDodatkowo
styles.css
powinno być wconfig.assets.precompile
którym jest lista rzeczy, które są prekompilowaneźródło
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
Czy to jest niepoprawne? '<link data-turbolinks-track="true" href="https://stackoverflow.com/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
Ale pliki javascript są poprawne! Nie rozumiem, dlaczego te same konfiguracje działają dla plików .js, ale nie .css.serve_static_files
jest przestarzałe i zostanie usunięte w Railsach 5.1. Użyjpublic_file_server.enabled = true
zamiast tego.404
. Czy rozwiązałeś to?zmień linię pliku Production.rb
w
a także dodaj
źródło
Używam Ubuntu Server 14.04 , Ruby 2.2.1 i Rails 4.2.4. Śledziłem proces wdrażania z DigitalOcean i wszystko poszło dobrze, ale kiedy idę do przeglądarki i wprowadzam adres IP mojego VPS, moja aplikacja jest ładowana, ale bez style i javascript.
Aplikacja działa z Unicorn i Nginx . Aby rozwiązać ten problem, wszedłem na mój serwer za pomocą SSH z moim użytkownikiem „deployer” i przeszedłem do ścieżki mojej aplikacji, czyli „/ home / deployer / apps / blog”, i uruchomiłem następujące polecenie:
Następnie ponownie uruchamiam VPS i to wszystko! Mi to pasuje!
Mam nadzieję, że może to być przydatne dla kogoś innego!
źródło
Jeśli ustawiono prekompilację, NIE potrzebujesz
ponieważ ma to służyć aktywnym zasobom.
Nasz problem polegał na tym, że mieliśmy tylko ustawioną bazę tajnych kluczy programistycznych
config/secrets.yml
Potrzebujesz wejścia do środowiska produkcyjnego
źródło
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
i uruchomićRAILS_ENV=production bundle exec rake assets:precompile
Czego NIE POWINIENEŚ robić:
Niektórzy z moich kolegów powyżej zalecili ci to zrobić:
Potok aktywów kolejowych mówi o powyższym podejściu:
Co powinieneś zrobić:
Prekompiluj swoje zasoby.
RAILS_ENV=production rake assets:precompile
Prawdopodobnie możesz to zrobić za pomocą zadania prowizji.
źródło
http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
źródło
Przede wszystkim sprawdź swoje zasoby, być może wystąpił błąd podczas wstępnej kompilacji zasobów.
Aby wstępnie skompilować zasoby w środowisku produkcyjnym, ENV uruchom to polecenie:
Jeśli wyświetla błąd, najpierw go usuń,
W przypadku błędu „niezdefiniowana zmienna”, załaduj ten plik zmiennej przed użyciem go w innym pliku.
przykład:
w pliku application.rb ustaw sekwencję wstępnej kompilacji aktywów
przykład:
źródło
Znajdź to:
Nazwa opcji konfiguracji
config.serve_static_assets
została zmieniona na,config.serve_static_files
aby wyjaśnić jej rolę.w
config/environments/production.rb
:Ustaw więc env
RAILS_SERVE_STATIC_FILES
lub usingNginx
do obsługi plików statycznych. Dodawanieconfig.serve_static_assets = true
będzie nadal działać, ale zostanie usunięte w przyszłości.źródło
nie jest zalecane, aby kapistrano dokonywał prekompilacji zasobów, ponieważ może to zająć całe wieki i często przerwać. spróbuj wykonać prekompilację zasobów lokalnych.
Najpierw ustaw w config / application.rb,
config.assets.initialize_on_precompile = false
a następnie wykonaj lokalneRAILS_ENV=production bin/rake assets:precompile
i dodaj te public / asset do git.i config / environment / development.rb, zmień ścieżkę do zasobów, aby uniknąć używania zasobów prekompilowanych:
config.assets.prefix = '/dev-assets'
Jeśli masz problem z połączeniem z bazą danych, oznacza to, że masz inicjator korzystający z bazy danych. sposobem obejścia tego problemu jest ustawienie nowego środowiska przez zduplikowanie pliku production.rb jako być może production2 .rb, a następnie w database.yml dodanie środowiska production2 z ustawieniem bazy danych deweloperskich . to zrób
RAILS_ENV=production2 bin/rake assets:precompile
jeśli nadal masz problem z zasobami, na przykład ckeditor, dodaj plik js do config / initializers / asset.rb
Rails.application.config.assets.precompile += %w( ckeditor.js )
źródło
Może się mylę, ale ci, którzy zalecają zmianę
config.assets.compile = true
Komentarz w tym wierszu brzmi: # Nie wracaj do potoku aktywów, jeśli brakuje wstępnie skompilowanego zasobu.
Sugeruje to, że ustawiając to na true, nie naprawiasz problemu, ale raczej omijasz go i uruchamiasz potok za każdym razem. To z pewnością musi zabić twoją wydajność i zniweczyć cel rurociągu?
Miałem ten sam błąd i był to skutek działania aplikacji w podfolderze, o którym railsy nie wiedziały.
Więc mój plik css jest w home / subfolder / app / public / .... ale railsy szukały w home / app / public / ...
spróbuj przenieść swoją aplikację z podfolderu lub powiedzieć railsom, że jest w podfolderze.
źródło
To rozwiązało problem w produkcji. Umieść go w konfiguracji nginx.
źródło
Nawet my stanęliśmy przed tym samym problemem, w którym
RAILS_ENV=production bundle exec rake assets:precompile
udało się, ale rzeczy nie działały zgodnie z oczekiwaniami.Okazało się, że głównym winowajcą był jednorożec.
Tak jak w Twoim przypadku, nawet my ponownie uruchamialiśmy jednorożca po skompilowaniu zasobów. Zauważono, że po ponownym uruchomieniu jednorożca uruchamiane są tylko jego procesy robocze, a nie proces główny.
Jest to główny powód, dla którego nie są wyświetlane prawidłowe zasoby.
Później, po skompilowaniu zasobów, zatrzymaliśmy się i uruchomiliśmy unicorn, aby proces wzorca unicorn również został ponownie uruchomiony, a prawidłowe zasoby były obsługiwane.
Zatrzymanie i uruchomienie jednorożca przynosi około 10 sekund przestoju w porównaniu do ponownego uruchomienia jednorożca. Jest to obejście, które można zastosować, gdy rozwiązanie długoterminowe jest przenoszone do pumy z jednorożca.
źródło