Как я могу определить дайджест MD5 данного актива в конвейере Rails?

Я пишу приложение, богатое Javascript, в проекте Ruby on Rails 3.1 и используя Handlebars для моей платформы шаблонов JS. Я пытаюсь выяснить способ динамического добавления MD5-дайджеста актива (генерируемого в ходе предварительной компиляции активов при производстве) к моим тегам внутри моего шаблона Handlebars. Я надеюсь, что есть хеш с пулом активов как ключ и дайджест MD5 в качестве значения, но я не смог его найти.

Идеальное решение будет передавать хэш из Ruby в Javascript и определять помощник Handlebars, который автоматически добавляет дайджест MD5 к атрибуту "src" этого актива.

Кто-нибудь пытался сделать что-то подобное? Должен быть способ использования шаблонов Javascript в Rails, а также воспользоваться преимуществами отпечатков пальцев.

Ответ 1

Как упоминалось в комментариях, добавление хэша в пути к активам является частью по умолчанию для конвейера активов.

В процессе производства Rails вставляет отпечаток MD5 в каждое имя файла, так что файл кэшируется веб-браузером

Подробнее о снятии отпечатков пальцев в конвейере активов здесь. Rails использует Sprockets для компиляции активов. Фингерпринт входит в состав процесса Sprockets.

Вы можете использовать метод find_asset Sprockets ', передавая логический путь к вашему ресурсу, чтобы получить экземпляр Sprockets::BundledAsset. Например

[1] pry(main)> Rails.application.assets.find_asset('application.js')
=> #<Sprockets::BundledAsset:0x3fe368ab8070 pathname="/Users/deefour/Sites/MyApp/app/assets/javascripts/application.js", mtime=2013-02-03 15:33:57 -0500, digest="ab07585c8c7b5329878b1c51ed68831e">

Вы можете вызвать digest_path на этом объекте, чтобы получить добавленную сумму MD5 к активу.

[1] pry(main)> Rails.application.assets.find_asset('application.js').digest_path
=> "application-ab07585c8c7b5329878b1c51ed68831e.js"

С помощью этих знаний вы можете легко создать помощника, чтобы вернуть digest_path для любого актива в вашем приложении и вызвать этого помощника из ваших файлов .js.erb.

Ответ 2

Это старый вопрос, но кажется, что в настоящее время вы можете использовать assets_manifest:

Rails.application.assets_manifest.assets["application.css"] => "application-46ae33e78e504ff295219f41d63c79719d062e48dc0c07bd9b6f7bcad72c6636.css"

Больше обсуждений здесь: https://github.com/rails/sprockets-rails/issues/311