2009-09-08 13 views
10

Tak więc stemplowanie czasu Rails jest świetne. Używam go do dodania nagłówków Expires do wszystkich plików, które kończą się dziesięciocyfrowym znacznikiem czasu. Większość moich obrazów jest jednak przywoływana w moim CSS. Czy ktokolwiek natknął się na jakąkolwiek metodę, która pozwala na dodanie znaczników czasu do obrazów przywoływanych w CSS, lub jakiejś funkcyjnej reguły ponownego zapisu, która to zapewnia? Chciałbym, aby WSZYSTKIE obrazy na mojej stronie, zarówno inline, jak i css, miały ten znacznik czasu, więc mogę powiedzieć przeglądarce, aby je buforowała, ale odśwież się za każdym razem, gdy sam plik się zmieni.Znaczniki czasu Rails na obrazach w CSS

Nie znalazłem nic w sieci w tej sprawie i nie mogę uwierzyć, że nie jest to temat częściej omawiany.

Nie sądzę, mój setup będzie miało znaczenia, ponieważ rzeczywista Wygasa będzie nadzieją zdarzyć w ten sam sposób, w oparciu o 10-cyfrowy datownik, ale używam apache służyć wszystkim statycznej zawartości, jeśli się liczy

+0

Oto moja odpowiedź poniżej, myślę, że najlepszym rozwiązaniem jest teraz użycie Jammit, do pakowania, które obsługuje to po wyjęciu z pudełka. – brad

Odpowiedz

4

Możesz dołączyć rzeczywisty znacznik czasu każdego pliku obrazu, poprzez uzyskanie czasu modyfikacji pliku takiego:

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 

(! Nie ma chyba bardziej elegancki sposób, aby napisać to, moje kotlety rubinowe są nadal słabe) Teraz hack robi się brzydki, ale ... można by sądzić, że będzie to bardziej podobny do Railsów.

+0

Twoje wyrażenie regularne nie zadziałało dla mnie, gdy w pobliżu były cytaty. Używając '/ url \ (([''] *) ([^ \ n '"] +) ([' "] *) \) /' działa –

+0

To działa niesamowicie! Dziękuję! – CalebHC

5

Używam asset packager, a ja skończyłem edytować metodę wtyczki compress_css, aby rozwiązać ten problem. I w zasadzie tylko regex dla obrazów w CSS, a następnie włóż aktualny timestamp:

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 

ten sposób, ilekroć wdrożyć, skompresowane obrazy CSS zawierają znaczniki czasu bieżącego. Upadek tej metody polega na tym, że każdy obraz nie otrzymuje własnego znacznika czasu, więc za każdym razem, gdy wdrażasz nowe css, wszystkie obrazy css są "wygasłe". Lepsze niż nic, chyba że często wdrażasz css.

+0

Interesujące, chociaż zdecydowanie się zgadzam, to mniej niż idealne posiadanie jednego znacznika czasu, w przeciwieństwie do każdego pliku mającego własny odpowiedni znacznik czasu, ale przypuszczam, że to jest lepsze niż nic. Thx za cynk. – brad

3

Najlepszym rozwiązaniem wydaje się być użycie ERB do wygenerowania arkuszy stylów, dzięki czemu można korzystać z pomocników Rails image_ zamiast bezpośrednich ścieżek obrazów. Czyli pozbądź się pliku public/stylesheets/application.css i utwórz app/views/stylesheets/application.css.erb. Będziesz także musiał utworzyć kontroler i włączyć buforowanie i ustawić trasę.

Oto szczegóły: http://deaddeadgood.com/2009/9/28/far-future-expires-headers-for-css-images-in-rails

+0

idealne! Dokładnie to, co ja " m. Na marginesie, zacząłem też czytać o Jammit http://documentcloud.github.com/jammit/. Wygląda to całkiem niezłym rozwiązaniem do pakowania aktywów w szyny! – brad

3

W przypadku ktoś natyka się na to, Jammit obsługuje to teraz po wyjęciu z pudełka. Używałem jammit w nowym projekcie i jestem pod ogromnym wrażeniem!

Powiązane problemy