Как генерировать идентификаторы активов в 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

который имеет встроенную маркировку активов.

Другие вопросы по тегам