rails 3.1.0 ActionView :: Template :: Error (application.css не компилируется)

281

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

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
bundle exec rake assets: прекомпиляция, кажется, исправляет это, но почему это не работает?
Крис Мюнх
10
У меня та же проблема с производством, даже после запуска комплекта exec rake assets: прекомпиляция
Лукас Ренан

Ответы:

313

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

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

Вы можете использовать эту опцию для возврата к Sprockets, когда вы используете предварительно скомпилированные ресурсы, но при этом отсутствуют какие-либо отсутствующие предварительно скомпилированные файлы.

Если для config.assets.compileпараметра установлено значение false и отсутствуют предварительно скомпилированные файлы, вы получите «AssetNoPrecompiledError», указывающее имя отсутствующего файла.

Крис Мюнх
источник
3
Возможно, вы захотите попробовать то, что написано в этой статье: devcenter.heroku.com/articles/rails31_heroku_cedar (я сам еще не пробовал)
Крис Муенч,
7
Просто чтобы прояснить, опция config.assets.compile находится в config / средах / production.rb (если вы работаете в производстве). И если вы хотите иметь возможность выполнять live / lazy compile в рабочей среде, вам также необходимо включить lazy compile в application.rb.
Авиация
34
Активация компиляции во время выполнения не является решением проблемы из-за снижения производительности, которое мы получаем. Решение состоит в том, чтобы исправить основную проблему, которая предотвращает прекомпиляцию активов.
Дэвид Туит
5
Я предварительно скомпилировал ресурсы, используя RAILS_ENV = производственный пакет exec rake assets: precompile. Почему я получаю эту ошибку и мне тоже нужно установить этот флаг?
Тони
2
@ Тони, потому что вы, вероятно, запрашиваете что-то кроме файла 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.

richardsun
источник
14
Я не могу поверить, как трудно было узнать, как это сделать.
derekerdmann
3
Похоже, что этот вариант лучше: установка live compile в значение true «использует больше памяти, работает хуже, чем по умолчанию, и не рекомендуется». guides.rubyonrails.org/asset_pipeline.html#live-compilation
andrew.rockwell
rake -Tили bundle exec rake -Tтвой друг.
Райан
2
@Underworld Bundler - это инструмент для управления гем-зависимостями в приложении ruby, и он встроен в Rails 3. Если вы используете bundler, запуск bundle exec rake ...гарантирует, что вы загружаете правильные грабли и связанные с ними зависимости для вашего приложения. Если вы не используете bundler, вы просто запустите rake ....
Richardsun
3
Если вы собираетесь выполнить приведенную выше команду, убедитесь, что вы уже установили свою среду в производственный режим, или добавьте в префикс команды RAILS_ENV = production
JESii
31

ОК, у меня была такая же проблема. Я не хотел использовать «config.assets.compile = true» - мне пришлось добавить все мои файлы .css в список в config / environment / 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'
user673207
источник
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
darchitect
источник
Это было единственное решение, которое сработало для меня. Может быть, это была проблема с моей версией Rails (3.1.3)? В любом случае, я могу сказать, что мои активы были успешно прекомпилированы в public / assets, и их имена файлов имели те же SHA, что перечислены в manifest.yml. По какой-то причине Rails больше не искал активы в нужном месте, хотя моя установка всегда работала хорошо раньше. Это изменение исправило это.
Антином
Спасибо за это решение. Я пытался протестировать некоторые вещи в режиме разработки, и я был удивлен, что он говорил «application.css не прекомпилирован», даже если я уже предварительно скомпилировал ресурсы, и в каталоге присутствовал public / assets / 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)
mathdancer
источник
2
Просто хочу уточнить, чтобы кто-нибудь сталкивался с этим позже, код, который нужно изменить выше, находится вconfig/application.rb
GMA
4

Вот быстрое решение:

Если вы используете capistrano, сделайте это и добавьте это в ваш deploy.rb:

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

раскрытие крышки

fivetwentysix
источник
2

Сегодня я столкнулся с этим сообщением об ошибке и хотел опубликовать решение в моем конкретном случае. Оказывается, моя проблема заключалась в том, что в одном из моих css-файлов отсутствовала закрывающая скобка, и это приводило к тому, что файл не компилировался. Это может быть сложнее заметить, если у вас есть автоматизированный процесс, который настраивает все (включая прекомпиляцию ресурсов) для вашей производственной среды.

SnapShot
источник
1

После всего остального не удалось ...

Мое решение было изменить файл макета с

= stylesheet_link_tag "reset-min", 'application'

в

= stylesheet_link_tag 'application'

И это сработало! (Вы можете поместить файл сброса в манифест.)

Виктор Пудеев
источник
1

Еще один способ исправить это на Heroku: убедитесь, что ваш Rakefile зафиксирован и отправлен.

phillbaker
источник
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
Sandip Ransing
источник
0

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

Muntasim
источник
0

Вы, вероятно, есть syntax errorв CSS, который вы используете.

Запустите эту команду

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

Это даст исключение, исправит это, и все готово.

Спасибо

Шоаиб Малик
источник