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.