Активы говорят, что они не предварительно скомпилированы, когда они предварительно скомпилированы

Итак, я получаю эту ошибку, когда пытаюсь использовать конвейер активов. Я не понимаю, чем это вызвано.

Sprockets::Helpers::RailsHelper::AssetPaths::AssetNotPrecompiledError in Photos#show

Showing .../app/views/photos/_photo_view.html.haml where line #2 raised:

jquery.autocomplete isn't precompiled

Extracted source (around line #2):

1: - content_for :scripts do
2:  = javascript_include_tag 'jquery.autocomplete'

Однако этот IS предварительно скомпилирован. Я запускал rake assets:precompile RAILS_ENV=production перед запуском сервера, и в моем каталоге public/assets у меня есть файл: jquery-5550a245a55b28927b5552cac182e612.autocomplete.js, а также .js.gz, и это точно отражено в манифесте:

#manifest.yml
---
application.js: application-4277323e3f7506b71f45c71e8a3a7c8f.js
jquery.autocomplete.js: jquery-5550a245a55b28927b5552cac182e612.autocomplete.js
jquery.cycle.all.min.js: jquery-183ef696b43944deaee5778d3094dbdd.cycle.all.min.js
jquery.fancybox.js: jquery-e52e44b2b4fb349bade9beb91461a810.fancybox.js
jquery.plupload.queue.js: jquery-f2e7f6ad7d2e5ca50235ed21f8d573cc.plupload.queue.js
jquery.tools.js: jquery-c53e304240fa56767fe0f2a00cb4bceb.tools.js
plupload.full.js: plupload-5dd26ee3fff6b627c19f196e9d1429dd.full.js
application.css: application-ce5217e1714cbc4e9c3ff6c5dfc9b221.css
fancybox.css: fancybox-9ee9c36f391086e4b0629b7df4042390.css
jquery.plupload.queue.css: jquery-661fbf3f503aa32ff11c004838c0820b.plupload.queue.css
jquery.js: jquery-4d23f0cfea862f56deb04f0a8ab1fcee.js
jquery.min.js: jquery-8a50feed8d29566738ad005e19fe1c2d.min.js

Рассматриваемый файл javascript не загружается в мой файл application.js, потому что он нужен мне только в одном представлении и больше нигде в приложении я его не использую. Чтобы учесть это (и исправить sprockets, пытающиеся скомпилировать партиалы sass), я настроил свое регулярное выражение перед компиляцией следующим образом:

#environments/production.rb
config.assets.precompile = [/^[a-zA-Z]*\..*/]

(Приведенное выше регулярное выражение предварительно компилирует любой файл, начинающийся с буквенного символа, и игнорирует файлы, начинающиеся с небуквенного символа, например символа подчеркивания).

Есть ли у кого-нибудь понимание того, что вызывает это и как это можно исправить? Конвейер активов заставляет меня рвать на себе волосы!

ОБНОВИТЬ

только что узнал, что Rails.configuration.assets.digests возвращает nil в производстве. возможно, проблема в том, что по какой-то причине sprockets не находит manifest.yml.

Я, вероятно, ошибаюсь, но похоже, что sprockets не использует assets_host в конфигурации при поиске manifest.yml.

https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/sprockets/railtie.rb#L38


person Andrew    schedule 03.10.2011    source источник


Ответы (3)


Я сам боролся с проблемой, хотя и с установленным config.assets.compile = false, поскольку я подозреваю, что в приведенном выше примере был установлен флаг true.

Невозможно настроить активы через пайплайн на локальном сервере rails 3.1.3

Мои наблюдения сводились к тому, что это ошибка Sprockets 2.0.3, как предложил UberNeet. Обходной путь состоял в том, чтобы либо удалить точку из имени ресурса, либо включить его как часть манифеста, а не ссылаться на него напрямую.

Отчет об ошибке для этого находится здесь: https://github.com/rails/rails/issues/ 3398

Глядя на вашу проблему выше и сопоставляя ее с моим опытом за последние два дня, я подозреваю, что существует проблема, связанная с именованием активов, когда установлено config.assets.compile = true. Эта проблема, вероятно, связана с именованием активов — в вашем манифесте библиотека jquery.autocomplete перекомпилирована как:

jquery-5550a245a55b28927b5552cac182e612.autocomplete.js

Но когда вы прекомпилируете эти активы через rake с помощью rake assets:precompile, я считаю, что они на самом деле скомпилированы в:

jquery.autocomplete-5550a245a55b28927b5552cac182e612.js

Вероятно, именно это несоответствие и вызывает проблему, о которой вы упомянули. Возможно, стоит поднять еще одну проблему github для этого, хотя обходные пути перечислены выше, и я понимаю, что Rails 3.2 будет использовать Sprockets 2.1.0, который может уже содержать исправление для этой проблемы.

person Phantomwhale    schedule 19.01.2012
comment
Я думаю, это все. Моя ошибка в конце концов исчезла, но я так и не понял почему — в какой-то момент я изменил структуру файла, и она, казалось бы, волшебным образом исчезла, теперь я думаю, что знаю почему. - person Andrew; 21.01.2012

Добавьте .js к

javascript_include_tag 'jquery.autocomplete.js'

Похоже, не хватает функциональности. Когда в имени файла есть точка '.' в названии расширение .js не будет добавлено при просмотре дайджеста.

Я выполнил некоторую отладку для Sprockets::Helpers::RailsHelper, и похоже, что методы digest_for получают логический путь без .js.

person guzart    schedule 15.10.2011
comment
Спасибо за этот ответ, это спасло меня от сильного обострения - person deadkarma; 22.03.2012
comment
у меня работает, хотя в имени моего файла нет точки: supersleight.js isn't precompiled в <%= javascript_include_tag 'supersleight' %>, хотя supersleight-d7d35147a0247a59d432bbe763e54a1a.js был скомпилирован и находится в папке public/assets/. Я добавил config.assets.precompile << 'supersleight.js' под application.rb. config.assets.compile = false тоже. - person lulalala; 30.05.2012

Убедитесь, что это не требуется раньше, например, в application.js.

person Maay    schedule 01.06.2012