Rails метки времени на изображениях в CSS

Итак, время тиснения Rails велико. Я использую его для добавления истечения заголовков ко всем файлам, которые заканчиваются десятичной меткой. Однако большинство моих изображений упоминаются в моем CSS. Кто-нибудь сталкивается с любым методом, который позволяет добавлять отметки времени к изображениям, на которые ссылаются CSS, или какое-то фанковое правило перезаписи, которое достигает этого? Мне бы хотелось, чтобы ВСЕ изображения на моем сайте, как встроенные, так и в css, имели эту метку времени, поэтому я могу сказать браузеру кэшировать их, но обновлять каждый раз, когда сам файл изменяется.

Я не мог найти ничего в сети относительно этого, и я не могу поверить, что это не более часто обсуждаемая тема.

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

Ответ 1

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

    source.gsub!(/url\((['"]*)(.+)(['"]*)\)/) do
      open, file, close = $1, $2, $3
      css_dir = File.join(RAILS_ROOT,"public/stylesheets")
      timestamp = ''
      FileUtils.cd(css_dir) do 
        if file =~ /^\// # absolute path
          f = File.new(RAILS_ROOT + "/public" + file)
        else # relative path
          f = File.new(file)
        end
        timestamp = f.mtime.to_i.to_s
      end

      if file =~ /.\.(ico|css|js|gif|jpe?g|png)/
        "url(#{open}#{file}?#{timestamp}#{close})"
      else
        "url(#{open}#{file}#{close})"
      end
    end

(Вероятно, более элегантный способ написать это, мои рубиновые отбивные все еще слабы!) Теперь взлом становится уродливым, хотя... вы думаете, что для этого будет больше Rails-способ.

Ответ 2

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

timestamp = Time.now.to_s.gsub(/\D/, '')
source.gsub!(/url\((['"])(.+)(['"])\)/) do
  open, file, close = $1, $2, $3
  if file =~ /.\.(ico|css|js|gif|jpe?g|png)/
    "url(#{open}#{file}?#{timestamp}#{close})"
  else
    "url(#{open}#{file}#{close})"
  end
end

Таким образом, всякий раз, когда я развертываю, сжатые изображения css содержат прикрепленные временные метки. Падение с помощью этого метода заключается в том, что каждое изображение не получает свою собственную метку времени, поэтому каждый раз, когда вы развертываете новый css, все изображения css "истекли". Лучше, чем ничего, если вы не будете часто развертывать css.

Ответ 3

Лучшим решением является использование ERB для генерации таблиц стилей, поэтому вы можете использовать помощники Rails image_ вместо прямых путей изображения. Смысл, избавиться от вашего файла public/stylesheets/application.css и создать приложение /views/stylesheets/application.css.erb. Вам также потребуется создать контроллер, включить кеширование и настроить маршрут.

Вот подробности: http://deaddeadgood.com/2009/9/28/far-future-expires-headers-for-css-images-in-rails

Ответ 4

В случае, если кто-то наткнется на это, Джаммит теперь поддерживает это из коробки. Я использую jammit в новом проекте, и я невероятно впечатлен!