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
Chris Muench
źródło
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.

Chris Muench
źródło
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

richardsun
źródło
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 \;
Don Law
źródło
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'
użytkownik673207
źródło
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.

Haris Krajina
źródło
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
darchitect
źródło
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)
matematyk
źródło
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

fivetwentysix
źródło
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.

Migawka
źródło
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).

Wiktor Pudiejew
źródło
1

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

Phillbaker
źródło
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
Sandip Ransing
źródło
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 :)

Muntasim
źródło
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

Shoaib Malik
źródło