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 katalogu public/assets.

Kiedy przeglądaj moją stronę, dostaję błąd 404 not found dla mysite.com/stylesheets/styles.css.

Co robię źle?

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).

Author: New Alexandria, 2013-09-09

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!
 96
Author: Rameshwar Vyevhare,
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?.

 74
Author: davmac,
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.

 31
Author: emersonthis,
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 to
config.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

 21
Author: Yanofsky,
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.

 10
Author: ytbryan,
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:

  1. wstępnie skompilować aktywa.
  2. 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;
    }
    
 9
Author: Châu Hồng Lĩnh,
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

 4
Author: Frederick Cheung,
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']
 3
Author: Jassa Mahal,
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!

 2
Author: Alex Ventura,
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

 2
Author: xxjjnn,
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

 2
Author: BKSpurgeon,
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

 1
Author: FreePender,
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.

 1
Author: Daniel Wei,
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']
 0
Author: Chitresh goyal,
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.

 0
Author: Brad,
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 )

 0
Author: James Tan,
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.

 0
Author: Pedro Adame Vergara,
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ą.

Tak samo jak w twojej sprawie, nawet my restartowaliśmy unicorna po skompilowaniu aktywów. Zauważono, że gdy unicorn jest restartowany, tylko jego procesy robocze są restartowane, a nie proces główny.
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.

 0
Author: Bhavya Keniya,
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