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

262

Я сделал базовое приложение 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
    У меня та же проблема с производством, даже после запуска bundle exec rake assets: precompile
Теги:
asset-pipeline

14 ответов

326
Лучший ответ

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

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

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

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

  • 0
    Я получаю ту же ошибку, но на Heroku. Удаленная выдача «rake assets: precompile» не работает. Нужно ли мне что-то еще, как установить какие-либо пути или что-то? Спасибо
  • 3
    Возможно, вы захотите попробовать то, что говорится в этой статье: devcenter.heroku.com/articles/rails31_heroku_cedar (я сам еще не пробовал)
Показать ещё 8 комментариев
200

Вы получите лучшую производительность в производстве, если вы установите config.assets.compile в false в production.rb и прекомпилируете свои активы. Вы можете предварительно скомпилировать эту команду:

bundle exec rake assets:precompile

Если вы используете Capistrano, версия 2.8.0 имеет рецепт для обработки этого во время развертывания. Для получения дополнительной информации см. Раздел "В процессе производства" Руководства по управлению активами: http://guides.rubyonrails.org/asset_pipeline.html

  • 13
    Я не могу поверить, как трудно было узнать, как это сделать.
  • 3
    Похоже, что этот вариант лучше: установка live compile в значение true «использует больше памяти, работает хуже, чем по умолчанию, и не рекомендуется». guides.rubyonrails.org/asset_pipeline.html#live-compilation
Показать ещё 7 комментариев
32

ОК - У меня была такая же проблема. Я не хотел использовать "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 \;
  • 0
    Если вы используете медиа-запросы и разные CSS-файлы для разных разрешений, это лучший способ.
  • 1
    Я должен включить все мои файлы CSS в массив? Что делать, если у меня есть 40 CSS-файлов?
31

Быстрое исправление для пользователя 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
  • 0
    Это было единственное решение, которое сработало для меня. Может быть, это была проблема с моей версией Rails (3.1.3)? В любом случае, я могу сказать, что мои активы были успешно прекомпилированы в public / assets, и их имена файлов имели те же SHA, что перечислены в manifest.yml. По какой-то причине Rails больше не искал активы в нужном месте, хотя моя установка ранее всегда работала нормально. Это изменение исправило это.
  • 0
    Спасибо за это решение. Я пытался протестировать некоторые вещи в режиме разработки, и я был удивлен, что он говорил: «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)
  • 2
    Просто хочу уточнить, чтобы кто-нибудь сталкивался с этим позже, код, который нужно изменить выше, находится в config/application.rb
4

Здесь быстрое исправление:

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

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

развертывание крышки

2

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

1

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

1

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

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

= stylesheet_link_tag "reset-min", 'application'

к

= stylesheet_link_tag 'application'

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

0

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

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

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

Это даст исключение, зафиксировало это, и все закончится.

Спасибо

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню