Rails 4: aktywa nie ładowane w produkcji
Próbuję uruchomić aplikację do produkcji, a ścieżki obrazów i zasobów css nie działają.
Oto co obecnie robię:
- zasoby obrazów na żywo w /app/assets/images / image.jpg
- arkusze stylów działają w /app/assets/stylesheets / style.css
- W moim układzie odwołuję się do pliku css tak:
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
- Przed ponownym uruchomieniem unicorn uruchamiam
RAILS_ENV=production bundle exec rake assets:precompile
i to się udaje i widzę odcisk palca w katalogupublic/assets
.
Kiedy przeglądaj moją stronę, dostaję błąd 404 not found dla mysite.com/stylesheets/styles.css
.
Aktualizacja: W moim layoucie 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 %>
Źródło generowania jest takie:
<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 Rails nie szuka poprawnie skompilowanych plików css. Ale to bardzo mylące dlaczego działa poprawnie dla javascripts (zwróć uwagę na ścieżkę /assets/****.js
).
18 answers
W rails 4 musisz wprowadzić zmiany poniżej:
config.assets.compile = true
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
To działa na mnie. użyj następującego polecenia, aby wstępnie skompilować zasoby
RAILS_ENV=production bundle exec rake assets:precompile
Powodzenia!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 22:59:47
Miałem ten sam problem i znalazłem to ustawienie w config / environments / production.rb:
# Rails 4:
config.serve_static_assets = false
# Or for Rails 5:
config.public_file_server.enabled = false
Zmieniając na true
działa. Wygląda na to, że domyślnie rails spodziewa się skonfigurowania serwera front-end tak, aby obsługiwał żądania plików z folderu publicznego zamiast proxy do aplikacji Rails. Być może zrobiłeś to dla swoich plików javascript, ale nie arkuszy stylów CSS?
(zobacz dokumentację Rails 5 ). Jak zaznaczono w komentarzach, z Rails 5 możesz po prostu ustawić zmienną środowiskową RAILS_SERVE_STATIC_FILES
, ponieważ domyślnym ustawieniem jest config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-28 05:24:19
W /config/environments/production.rb
musiałem dodać to:
Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )
The .js był już precompilowany, ale i tak go dodałem. The .css i .css.erb najwyraźniej nie dzieje się automatycznie. ^[^_]
wyklucza częściowe z kompilacji -- jest to wyrażenie regularne.
To trochę frustrujące, że dokumenty wyraźnie stwierdzają, że rurociąg zasobów jest domyślnie włączony, ale nie wyjaśnia faktu, że dotyczy to tylko javascripts.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-27 03:26:00
Udało mi się rozwiązać ten problem zmieniając:
config.assets.compile = false
toconfig.assets.compile = true
in /config/environments/production.rb
Aktualizacja (czerwiec 24, 2018): ta metoda tworzy lukę bezpieczeństwa, jeśli używana wersja Sprockets jest mniejsza niż 2.12.5, 3.7.2 lub 4.0.0.beta8
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-25 01:11:29
Dla Rails 5, powinieneś włączyć następujący kod konfiguracyjny:
config.public_file_server.enabled = true
Domyślnie, Rails 5 wyświetla tę linię konfiguracji:
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
Dlatego należy ustawić zmienną środowiskową RAILS_SERVE_STATIC_FILES
na true.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-04 12:24:35
Są 2 rzeczy, które musisz osiągnąć, aby służyć aktywom w produkcji:
- wstępnie skompilować aktywa.
- Udostępnij zasoby na serwerze przeglądarce.
1) aby wstępnie skompilować aktywa, masz kilka opcji.
Możesz uruchomić
rake assets:precompile
na lokalnym komputerze, zatwierdzić go do kontroli kodu źródłowego (git), a następnie uruchomić program wdrożeniowy, na przykład capistrano. Nie jest to dobry sposób na przypisanie wstępnie skompilowanych zasobów do SCM.Możesz napisać zadanie rake, które uruchamia się
RAILS_ENV=production rake assets:precompile
na serwerach docelowych za każdym razem, gdy wdrażasz aplikację Rails do produkcji, przed ponownym uruchomieniem serwera.
Kod w zadaniu dla capistrano będzie wyglądał podobnie do tego:
on roles(:app) do
if DEPLOY_ENV == 'production'
execute("cd #{DEPLOY_TO_DIR}/current && RAILS_ENV=production rvm #{ruby_string} do rake assets:precompile")
end
end
2) Teraz masz zasoby na serwerach produkcyjnych, musisz je podać do przeglądarki.
Znowu masz kilka możliwości.-
Włącz plik statyczny Rails obsługujący w config / environments / production.rb
config.serve_static_assets = true # old or config.serve_static_files = true # new
Używanie Rails do serwowania plików statycznych zabije wydajność aplikacji Rails.
-
Skonfiguruj nginx (lub Apache) do obsługi plików statycznych.
Na przykład mój nginx skonfigurowany do pracy z Pumą wygląda tak:]}location ~ ^/(assets|images|fonts)/(.*)$ { alias /var/www/foster_care/current/public/$1/$2; gzip on; expires max; add_header Cache-Control public; }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-10 07:26:42
Rails 4 nie generuje już wersji zasobu bez odcisków palców: stylesheets / style.css nie zostanie wygenerowany dla Ciebie.
Jeśli użyjesz stylesheet_link_tag
, wygenerowany zostanie odpowiedni link do twojego arkusza stylów
Dodatkowo styles.css
powinno znajdować się w config.assets.precompile
czyli liście rzeczy, które są prekompilowane
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-10 10:59:11
Zmień swoją produkcję.RB file line
config.assets.compile = false
Do
config.assets.compile = true
A także dodać
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-25 11:33:06
Uruchamiam Ubuntu Server 14.04, Ruby 2.2.1 i Rails 4.2.4 śledziłem deploy turorial z DigitalOcean i wszystko poszło dobrze, ale kiedy idę do przeglądarki i wprowadzam adres IP mojego VPS moja aplikacja jest załadowana, ale bez stylów i javascript.
[[1]} aplikacja działa z Unicorn i Nginx . Aby rozwiązać ten problem weszłam na mój serwer używając SSH z moim użytkownikiem 'deployer' i przejdź do mojej ścieżki aplikacji, która na '/Strona główna / deployer / Aplikacje / blog' i uruchom następujące polecenie:RAILS_ENV=production bin/rake assets:precompile
Potem restartuję VPS i tyle! Dla mnie działa!
Mam nadzieję, że to może być przydatne dla kogoś innego!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-09 05:51:58
Jeśli precompile jest ustawione nie musisz
config.assets.compile = true
Jak to ma służyć aktywom na żywo.
Nasz problem polegał na tym, że w config/secrets.yml
development:
secret_key_base: '83d141eeb181032f4070ae7b1b27d9ff'
Potrzeba wejścia do środowiska produkcyjnego
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 20:12:18
Czego nie należy robić:
Niektórzy z moich kolegów powyżej polecili ci to zrobić:
config.serve_static_assets = true ## DON”T DO THIS!!
config.public_file_server.enabled = true ## DON”T DO THIS!!
The rails asset pipeline mówi o powyższym podejściu:
Ten tryb wykorzystuje więcej pamięci, działa gorzej niż domyślny i nie jest zalecany. Zobacz tutaj: ( http://edgeguides.rubyonrails.org/asset_pipeline.html#live-compilation )
Co powinieneś zrobić:
1. Precompile your aktywa.
RAILS_ENV=production rake assets:precompile
2. Dodaj te pliki do git.
git add –all
3. Pchnij do heroku.
git push origin master
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-11 03:08:48
Domyślny matcher do kompilacji plików zawiera aplikację.js, podanie.css i wszystkie pliki inne niż JS / CSS (będzie to automatycznie obejmować wszystkie zasoby obrazu) z folderów app / assets, w tym twoje klejnoty: {]}
Jeśli masz inne manifesty lub indywidualne arkusze stylów i pliki JavaScript do załączenia, możesz dodać je do tablicy precompile w config/initializers / assets.rb:
Rails.application.config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']
Http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-15 05:17:05
Znalazłem to:
Opcja konfiguracyjna config.serve_static_assets
została zmieniona na config.serve_static_files
w celu wyjaśnienia jej roli.
W config/environments/production.rb
:
# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
Więc ustaw env RAILS_SERVE_STATIC_FILES
lub użyj Nginx
do obsługi plików statycznych.
Add config.serve_static_assets = true
będzie nadal działać, ale zostanie usunięty w przyszłości.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-29 04:14:24
Przede wszystkim sprawdź swoje aktywa, może być możliwe, że jest jakiś błąd w wstępnej kompilacji aktywów.
Aby wstępnie skompilować zasoby w ENV produkcyjnym uruchom to polecenie:
RAILS_ENV=production rake assets:precompile
Jeśli pokazuje błąd, usuń ten pierwszy,
W przypadku błędu "undefined variable", Załaduj plik tej zmiennej przed użyciem go w innym pliku.
Przykład:
@import "variables";
@import "style";
W aplikacji.zbiór plików rb Sekwencja wstępnej kompilacji aktywów
Przykład:
config.assets.precompile += [ 'application.js', 'admin.js', 'admin/events.js', 'admin/gallery.js', 'frontendgallery.js']
config.assets.precompile += [ 'application.css', 'admin.css','admin/events.css', 'admin/gallery.css', 'frontendgallery.css']
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-20 06:51:21
Może się mylę, ale ci, którzy zalecają zmianę
config.assets.compile = true
Komentarz w tej linii brzmi: #nie zastępuj potoku zasobów, jeśli wstępnie skompilowany zasób zostanie pominięty.
Sugeruje to, że ustawiając to na true Nie naprawiasz problemu, ale raczej omijasz go i uruchamiasz rurociąg za każdym razem. To z pewnością musi zabić Twoje wyniki i pokonać cel rurociągu?
Miałem ten sam błąd i było to spowodowane aplikacją działającą w sub folder, o którym rails nie wiedział.
Więc mój plik css gdzie w home / podfolder / app / public/.... ale rails szukał w home / app / public/...
Spróbuj przenieść aplikację z podfolderu lub powiedzieć rails, że znajduje się w podfolderze.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-16 16:23:21
Nie zaleca się, aby capistrano robił prekompilację aktywów, ponieważ może to zająć wieki i często czas. spróbuj wykonać prekompilację zasobów lokalnych.
Pierwszy, ustawiony w config / application.rb
config.assets.initialize_on_precompile = false
następnie wykonaj lokalne
RAILS_ENV=production bin/rake assets:precompile
i dodać te public / assets do git.
I config / environments / development.rb, zmień ścieżkę zasobu, aby uniknąć użycia wstępnie skompilowanych zasobów:
config.assets.prefix = '/dev-assets'
Jeśli masz problem z połączeniem db, oznacza, że masz inicjalizator, który używa db. jednym ze sposobów jest ustawienie nowe środowisko przez duplikat produkcji.rb jako maybe production2.rb, oraz w bazie danych.yml, add production2 environment with development db setting. następnie wykonaj
RAILS_ENV=production2 bin/rake assets:precompile
Jeśli nadal masz problemy z aktywami, na przykład ckeditor, Dodaj plik js do config / initializers / assets.rb
Rails.application.config.assets.precompile += %w( ckeditor.js )
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-09 16:22:18
location ~ ^/assets/ {
expires 1y;
add_header Cache-Control public;
add_header ETag "";
}
To naprawiło problem dla mnie w produkcji. Umieść go w konfiguracji nginx.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-29 09:18:56
Nawet my mieliśmy do czynienia z tym samym problemem, gdzie RAILS_ENV=production bundle exec rake assets:precompile
udało się, ale rzeczy nie działały zgodnie z oczekiwaniami.
Odkryliśmy, że jednorożec był tu głównym winowajcą.
Jest to główny powód, dla którego prawidłowe aktywa nie są obsługiwane.
Później, po skompilowaniu aktywów, zatrzymaliśmy się i zaczęliśmy unicorn więc że proces unicorn master został również ponownie uruchomiony i prawidłowe aktywa zostały dostarczone.
Zatrzymanie i uruchomienie jednorożca przynosi około 10 sekund przestoju w porównaniu z ponownym uruchomieniem jednorożca. Jest to obejście, które można zastosować, gdy długotrwałym rozwiązaniem jest przeniesienie do puma z unicorn.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-14 14:20:41