rails 3.1.0 ActionView :: Шаблон :: Помилка (application.css не попередньо компілюється)


281

Я зробив базовий додаток для рейків із простим контролером сторінок з функцією індексу, і коли завантажую сторінку, я отримую:

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
buckle exec активи граблі: попереднє компіляція, здається, виправляє це, але чому це не працює просто?
Кріс Мюнч

10
У мене така ж проблема у виробництві, навіть після запуску пакетів для виконання граблівих активів: попередній компіляція
Лукас Ренан

Відповіді:


313

За замовчуванням Rails передбачає, що у вас є файли, попередньо скомпільовані у виробничому середовищі, якщо ви хочете використовувати живу компіляцію (компілювати активи під час виконання) у виробництві, ви повинні встановити config.assets.compile на true .

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

Ви можете використовувати цю опцію для резервного копіювання до Зірок, коли ви використовуєте попередньо складені об’єкти, але є якісь відсутні попередньо складені файли.

Якщо для config.assets.compileпараметра встановлено значення false та відсутні попередньо складені файли, ви отримаєте "AssetNoPrecompiledError" із зазначенням імені відсутнього файлу.


3
Ви можете спробувати те, що йдеться в цій статті: devcenter.heroku.com/articles/rails31_heroku_cedar (я ще цього не пробував)
Chris Muench

7
Щоб зрозуміти, параметр config.assets.compile знаходиться в config / environment / production.rb (якщо ви працюєте у виробництві). І якщо ви хочете мати змогу робити живі / ліниві компіляції у виробництві, вам також потрібно включити лінивий збірник у application.rb.
avioing

34
Активізація компіляції виконання не є рішенням, оскільки ми сприймаємо продуктивність. Рішення полягає у вирішенні основної проблеми, яка запобігає виникненню попередньої компіляції активів.
Девід Туйте

5
Я попередньо скомпілював активи, використовуючи RAILS_ENV = виробничий пакет exec рейкових активів: precompile. Чому я отримую цю помилку і мені потрібно було також встановити цей прапор?
Тоні

2
@Tony, тому що ви, ймовірно, просите щось інше, ніж файл application.css / js / image, і ви не зареєстрували його application.rb. Додати / редагувати application.rb: config.assets.precompile += %w( first.css second.js ). Тепер ці файли також будуть компілюватися. Не додайте всі файли, якщо ви використовуєте їх лише у зірочках require, але лише якщо ви додасте їх до <link>/<script>
elado

202

Ви отримаєте кращі показники у виробництві, якщо встановити config.assets.compile на значення false у production.rb і попередньо скласти свої активи. Ви можете виконати компіляцію з цим завданням граблі:

bundle exec rake assets:precompile

Якщо ви використовуєте Capistrano, версія 2.8.0 має рецепт вирішення цього питання під час розгортання. Для отримання додаткової інформації дивіться розділ "У виробництві" Посібника по трубопроводі активів: http://guides.rubyonrails.org/asset_pipeline.html


14
Я не можу повірити, як важко було з’ясувати, як це зробити.
derekerdmann

3
Це здається явно кращим варіантом: встановлення компіляції в реальному часі на істинне "використовує більше пам'яті, працює менше, ніж за замовчуванням, і не рекомендується". guides.rubyonrails.org/asset_pipeline.html#live-compilation
andrew.rockwell

rake -Tабо bundle exec rake -Tтвій друг.
Райан

2
@Underworld Bundler - це інструмент для управління залежностями дорогоцінних каменів у рубіновій програмі, і він вбудований в Rails 3. Якщо ви використовуєте bundler, запуск bundle exec rake ...забезпечить завантаження правильної граблі та пов'язаних залежностей для вашої програми. Якщо ви не використовуєте пакет, ви просто запустите rake ....
richardsun

3
Якщо ви збираєтеся запустити вищевказану команду, переконайтеся, що ви вже встановили своє середовище до режиму виробництва, або вставте команду RAILS_ENV = production
JESii

31

Гаразд - у мене була така ж проблема. Я не хотів використовувати "config.assets.compile = true" - мені довелося додати всі свої .css файли до списку в config / середовища / production.rb:

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

Тоді мені довелося створити (а пізніше видалити) tmp / restart.txt

Я послідовно використовував помічник stylesheet_link_tag, тому знайшов усі додаткові файли css, які мені потрібно було додати:

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

Якщо ви використовуєте медіа-запити та різні файли css для різної роздільної здатності, це найкращий шлях.
Fa11enAngel

1
Я повинен включити всі свої файли css до масиву? Що робити, якщо у мене є 40 файлів css?
йозз

30

Швидке виправлення для capistrano користувача - це розміщення цієї лінії в Capfile

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

11

Для всіх тих, хто читає це, але у них немає проблем, application.cssа замість них - звичайні класи CSS, наприклад admin.css, base.cssтощо.

Рішення - використовувати, як згадувалося

bundle exec rake assets:precompile

А в таблицях стилів посилання просто посилання application.css

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

Оскільки конвеєр активів попередньо складе всі ваші таблиці стилів у application.css. Це також відбувається в процесі розробки, тому використання будь-яких інших посилань є неправильним при використанні конвеєра активів.


8

У мене було саме таку помилку в моєму середовищі розробки. Зрештою, все, що мені потрібно було зробити, щоб виправити це, було додати:

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

до мого файлу config / environment / development.rb і це виправили. Моє остаточне налаштування в розробці, пов'язане з активами, виглядає так:

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

Це було єдине рішення, яке працювало на мене. Можливо, це була проблема з моєю версією Rails (3.1.3)? У будь-якому випадку, я можу сказати, що мої активи були успішно попередньо скомпільовані для загальнодоступних / активів, а їхні назви файлів мали ті ж SHA, що і вказані в manifest.yml. Чомусь Rails вже не шукав активів у потрібному місці, хоча моя установка раніше працювала нормально. Ця зміна виправила це.
antinome

Дякую за це рішення. Я намагався перевірити деякі речі в режимі розробки, і мене здивувало, що він говорить "application.css не докомпілюється", хоча я вже мав попередньо скомпільовані активи та public / tools / application.css, які були в каталозі. Здивовані, вони не встановлюють налаштування config.assets.manifest для вас автоматично в розвитку, як це роблять у виробництві ..
Тайлер Рік

5

У мене також була ця проблема, коли намагання запустити виробництво без попереднього компіляції все одно призвело б до попередньо не компільованих помилок. Мені довелося змінити, який рядок коментується 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
Просто хочу уточнити для всіх, хто стикається з цим пізніше, код, який потрібно змінити, знаходиться вconfig/application.rb
GMA

4

Ось швидке виправлення:

Якщо ви використовуєте capistrano, зробіть це, додайте це до свого implemen.rb:

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

шапка розгортання


2

Я зіткнувся з цим повідомленням про помилку сьогодні і хотів опублікувати резолюцію в моєму конкретному випадку. Виявляється, моя проблема полягала в тому, що в одному з моїх файлів css не було закриваючої дужки, і це спричинило некомпіляцію файлу. Це може бути важче помітити, якщо у вас є автоматизований процес, який встановлює все (включаючи прекомпіляцію активів) для вашого виробничого середовища.


1

Зрештою не вдалося ...

Моє рішення полягало в тому, щоб змінити файл верстки з

= stylesheet_link_tag "reset-min", 'application'

до

= stylesheet_link_tag 'application'

І це спрацювало! (Ви можете помістити файл скидання всередину маніфесту.)


1

Ще один спосіб виправити це на Heroku: переконайтеся, що ваш Rakefile зроблений і натиснутий.


0

На сервері heroku (файлова система лише для читання), якщо ви хочете компілювати css (не рекомендується, але ви можете це зробити), переконайтеся, що ви виконали налаштування, як показано нижче -

# 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

якщо ви думаєте, що ви дотримувались всього хорошого, але все ще невдало, просто переконайтеся, що ви / capistrano запускаєте touch tmp / restart.txt або подібний в кінці. Я був у списку нещасливих, але зараз :)


0

Напевно syntax errorу вас є css, який ви використовуєте.

Виконайте цю команду

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

Це дасть виняток, зафіксувавши це, і ви все зробили.

Дякую

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.