Как генерировать идентификаторы активов в Rails 3 для управления кешем?
В Rails при обслуживании статических файлов вы получаете asset ID
который добавлен к URL, например,
<script src="/javascripts/application.js?1300371955" ...
<link href="/stylesheets/custom.css?1299690788" ...
Таким образом, URL-адрес статического файла изменяется, если изменяется временная метка файла и браузеры автоматически запрашивают новый файл.
Я видел это, используя вспомогательные методы для включения статических ресурсов --- stylesheet_link_tag
, javascript_include_tag
а также image_tag
--- Rails автоматически добавляет временные метки ко всем ссылкам на эти файлы.
Как я могу реализовать нечто подобное для других ресурсов, у которых нет таких вспомогательных методов
например, .swf
файлы?
(Есть ли у этой "стратегии" принудительной повторной загрузки имя; если да, то как оно называется?)
2 ответа
Метод Rails, который добавляет метку времени к ресурсам, называется rails_asset_id и определяется в ActionView:: Helpers:: AssetTagHelper. Хотя это частный метод, к нему можно обратиться в помощнике, чтобы сгенерировать его для ваших пользовательских тегов, например так:
def swf_param_tag(path)
asset_id = rails_asset_id(path)
"<param name='movie' value='#{path}?#{asset_id}'/>"
end
Вам нужно передать путь, потому что он вызывает File.mtime (путь).to_i.to_s для него, чтобы получить время последнего изменения.
Дальнейшее объяснение того, что тег актива покупает у вас здесь: http://api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html
@Unixmonkey: ваше решение работает очень хорошо.
В качестве альтернативы есть также плагин swf_fu:
относитесь к своим SWF-файлам Adobe Flash как к любому другому ресурсу (изображения, JavaScript и т. д.) и вставляйте их с помощью SWFObject 2.2
который имеет встроенную маркировку активов.