szyny 3.1.0 ActionView :: Szablon :: Błąd (application.css nie jest prekompilowany)


281

Zrobiłem podstawową aplikację railsową z prostym kontrolerem stron z funkcją indeksu, a kiedy ładuję stronę, otrzymuję:

ActionView::Template::Error (application.css isn't precompiled):
    2: <html>
    3: <head>
    4:   <title>Demo</title>
    5:   <%= stylesheet_link_tag    "application" %>
    6:   <%= javascript_include_tag "application" %>
    7:   <%= csrf_meta_tags %>
    8: </head>
  app/views/layouts/application.html.erb:5:in `_app_views_layouts_application_html_erb__43625033_88530400'

Gemfile

source 'http://rubygems.org'

gem 'rails', '3.1.0'

# Bundle edge Rails instead:
# gem 'rails',     :git => 'git://github.com/rails/rails.git'

gem 'sqlite3'

gem 'execjs'
gem 'therubyracer'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails', "  ~> 3.1.0"
  gem 'coffee-rails', "~> 3.1.0"
  gem 'uglifier'
end

gem 'jquery-rails'

# Use unicorn as the web server
# gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger
# gem 'ruby-debug19', :require => 'ruby-debug'

group :test do
  # Pretty printed test output
  gem 'turn', :require => false
end

7
pakuj zasoby rake exec: prekompilacja wydaje się to naprawiać, ale dlaczego to po prostu nie działa?
Chris Muench,

10
Mam ten sam problem w produkcji, nawet po uruchomieniu pakietu pakietu rake exec: prekompilacja
Lucas Renan

Odpowiedzi:


313

Domyślnie Railsy zakładają, że masz wstępnie skompilowane pliki w środowisku produkcyjnym, jeśli chcesz używać kompilacji na żywo (kompiluj zasoby w czasie wykonywania) podczas produkcji, musisz ustawić config.assets.compile na true .

# config/environments/production.rb
...
config.assets.compile = true
...

Tej opcji można użyć do powrotu do Sprockets, gdy używasz zasobów prekompilowanych, ale brakuje plików prekompilowanych.

Jeśli config.assets.compileopcja jest ustawiona na wartość false i brakuje wstępnie skompilowanych plików, pojawi się komunikat „AssetNoPrecompiledError” wskazujący nazwę brakującego pliku.


3
Może chcesz spróbować, co mówi ten artykuł: devcenter.heroku.com/articles/rails31_heroku_cedar (nie próbowałem to sam jeszcze)
Chris Muench

7
Żeby było jasne, opcja config.assets.compile znajduje się w config / environment / production.rb (jeśli pracujesz w środowisku produkcyjnym). A jeśli chcesz mieć możliwość wykonywania na żywo / leniwej kompilacji produkcyjnej, musisz także włączyć leniwą kompilację w application.rb.
lot z

34
Aktywacja kompilacji środowiska uruchomieniowego nie jest rozwiązaniem, ponieważ podnosimy wydajność. Rozwiązaniem jest rozwiązanie podstawowego problemu, który zapobiega wstępnej kompilacji zasobów.
David Tuite

5
Prekompilowałem zasoby za pomocą RAILS_ENV = zasoby pakietu wykonawczego pakietu produkcyjnego: prekompilacja. Dlaczego dostaję ten błąd i muszę również ustawić tę flagę?
Tony

2
@ Tony, ponieważ prawdopodobnie poprosiłeś o coś innego niż plik application.css / js / image i nie zarejestrowałeś się w nim application.rb. Dodaj do / edit application.rb: config.assets.precompile += %w( first.css second.js ). Teraz te pliki również się skompilują. Nie dodawaj wszystkich plików, jeśli używasz ich tylko w zębatkach require, ale tylko jeśli <link><script>
dołączasz

202

Lepszą wydajność w produkcji uzyskasz, jeśli ustawisz config.assets.compile na false w production.rb i wstępnie skompilujesz swoje zasoby. Możesz wstępnie skompilować za pomocą tego zadania prowizji:

bundle exec rake assets:precompile

Jeśli używasz Capistrano, wersja 2.8.0 ma przepis, który poradzi sobie z tym w czasie wdrażania. Aby uzyskać więcej informacji, zobacz sekcję „W produkcji” Przewodnika dotyczącego rurociągów zasobów: http://guides.rubyonrails.org/asset_pipeline.html


14
Nie mogę uwierzyć, jak trudno było dowiedzieć się, jak to zrobić.
derekerdmann

3
Wydaje się, że jest to zdecydowanie lepsza opcja: ustawienie prawdziwej kompilacji na żywo „zużywa więcej pamięci, działa gorzej niż domyślnie i nie jest zalecane”. guide.rubyonrails.org/asset_pipeline.html#live-compilation
andrew.rockwell

rake -Tlub bundle exec rake -Tjest twoim przyjacielem.
Ryan

2
@Underworld Bundler to narzędzie do zarządzania zależnościami klejnotów w aplikacji ruby ​​i jest wbudowane w Rails 3. Jeśli korzystasz z bundlera, uruchomienie bundle exec rake ...zapewni, że załadujesz odpowiednią prowizję i powiązane zależności dla twojej aplikacji. Jeśli nie korzystasz z programu pakującego, wystarczy uruchomić rake ....
richardsun

3
Jeśli zamierzasz uruchomić powyższą komendę, upewnij się, że masz już ustawione środowisko do trybu produkcyjnego, lub przedrostek komendy RAILS_ENV = produkcja
JESii 29.04.13

31

OK - miałem ten sam problem. Nie chciałem używać „config.assets.compile = true” - musiałem dodać wszystkie moje pliki .css do listy w config / environment / production.rb:

config.assets.precompile += %w( carts.css )

Następnie musiałem utworzyć (a później usunąć) tmp / restart.txt

Konsekwentnie korzystałem z pomocnika stylesheet_link_tag, więc znalazłem wszystkie dodatkowe pliki css, które musiałem dodać za pomocą:

find . \( -type f -o -type l \) -exec grep stylesheet_link_tag {} /dev/null \;

Jeśli używasz zapytań o media i różnych plików css dla różnych rozdzielczości, jest to najlepsza droga.
Fa11enAngel

1
Czy muszę dołączyć wszystkie moje pliki CSS do tablicy? Co jeśli mam 40 plików css?
yozzz

30

Szybkim rozwiązaniem dla użytkownika capistrano jest umieszczenie tej linii w pliku Capfile

# Uncomment if you are using Rails' asset pipeline
load 'deploy/assets'

11

Dla wszystkich, którzy to czytają, ale nie mają problemu z application.cssniestandardowymi klasami CSS i zamiast nich admin.css, np. base.cssItp.

Rozwiązaniem jest użycie, jak wspomniano

bundle exec rake assets:precompile

A w arkuszach stylów odniesienia są tylko odniesieniami application.css

<%= stylesheet_link_tag    "application", :media => "all" %>

Ponieważ potok zasobów wstępnie skompiluje wszystkie arkusze stylów w application.css. Dzieje się tak również w fazie rozwoju, więc używanie innych odniesień jest nieprawidłowe podczas korzystania z potoku zasobów.


8

Miałem dokładnie ten sam błąd w moim środowisku programistycznym. Ostatecznie wszystko, co musiałem zrobić, aby to naprawić, to dodać:

config.assets.manifest = Rails.root.join("public/assets")

do mojego pliku config / environment / development.rb i naprawiłem to. Moja końcowa konfiguracja w rozwoju związana z zasobami wygląda następująco:

config.assets.compress = false  
config.assets.precompile += %w[bootstrap-alerts.js] #Lots of other space separated files
config.assets.compile = false
config.assets.digest = true
config.assets.manifest = Rails.root.join("public/assets")
config.assets.debug = true

To było jedyne rozwiązanie, które działało dla mnie. Może to był problem z moją wersją Railsów (3.1.3)? W każdym razie, mogłem stwierdzić, że moje zasoby zostały pomyślnie skompilowane do publicznych / aktywów, a ich nazwy plików miały takie same SHA jak wymienione w manifest.yml. Z jakiegoś powodu Railsy nie szukały już zasobów we właściwym miejscu, mimo że moja konfiguracja zawsze działała dobrze. Ta zmiana to naprawiła.
antinome

Dzięki za to rozwiązanie. Próbowałem przetestować niektóre rzeczy w trybie programistycznym i zdziwiłem się, że powiedziałem „application.css nie jest prekompilowany”, mimo że miałem już prekompilowane zasoby, a katalog publiczny / asset / application.css był obecny w katalogu. Zaskoczeni, że nie ustawili dla ciebie automatycznie config.assets.manifest, tak jak robią to w produkcji.
Tyler Rick

5

Miałem również ten problem, w którym próba uruchomienia w środowisku produkcyjnym bez prekompilacji nadal powodowałaby błędy niekompilowane. Musiałem zmienić, który wiersz został skomentowany application.rb:

  # If you precompile assets before deploying to production, use this line
  # Bundler.require(*Rails.groups(:assets => %w(development test)))
  # If you want your assets lazily compiled in production, use this line
  Bundler.require(:default, :assets, Rails.env)

2
Chcę wyjaśnić wszystkim, którzy napotkają ten problem później, kod, który musisz zmienić powyżej, znajduje się wconfig/application.rb
GMA

4

Oto szybka poprawka:

Jeśli używasz capistrano, zrób to, dodaj to do pliku deploy.rb:

after 'deploy:update_code' do
  run "cd #{release_path}; RAILS_ENV=production rake assets:precompile"
end

wdrożenie WPR


2

Natknąłem się dziś na ten komunikat o błędzie i chciałem opublikować rozwiązanie w mojej konkretnej sprawie. Okazuje się, że mój problem polegał na tym, że w jednym z moich plików css brakowało nawiasu zamykającego, co powodowało, że plik nie został skompilowany. Trudniej to zauważyć, jeśli masz zautomatyzowany proces, który konfiguruje wszystko (w tym prekompilację zasobów) dla środowiska produkcyjnego.


1

Po tym wszystkim innym się nie udało ...

Moim rozwiązaniem była zmiana pliku układu z

= stylesheet_link_tag "reset-min", 'application'

do

= stylesheet_link_tag 'application'

I zadziałało! (Możesz umieścić plik resetowania w manifeście).


1

Kolejny sposób, aby to naprawić w Heroku: Upewnij się, że Twój Rakefile jest zatwierdzony i wypchnięty.


0

Na serwerze heroku (tylko do odczytu system plików), jeśli chcesz kompilację css w czasie wykonywania (nie jest to zalecane, ale możesz to zrobić), upewnij się, że dokonałeś ustawień takich jak poniżej -

# inside config/application.rb
config.assets.enabled = true
config.assets.prefix = Rails.root.join('tmp/assets').to_s

# If you are using sass then keep gem outside of asset group
 gem 'sass-rails',   '3.1.4'

# inside config/environments/production.rb
config.assets.compile = true

0

jeśli uważasz, że podążałeś za wszystkim dobrze, ale nadal nie miałeś szczęścia, po prostu upewnij się, że / capistrano run touch tmp / restart.txt lub równoważny na końcu. Byłem na pechowej liście, ale teraz :)


0

Prawdopodobnie masz syntax errorw używanym css.

Uruchom to polecenie

$ bundle exec rake assets:precompile RAILS_ENV=development --trace

To da wyjątek, naprawisz to i wszystko gotowe.

Dzięki

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.