2013-05-23 17 views
9

Ponieważ Rails 4 usunął buforowanie stron i buforowanie akcji, zastanawiam się, w jaki sposób Rails 4 buforuje akcję, która nie ma zmiennych i ma tylko html w widoku? Czy powinienem fragmentować pamięć podręczną statycznego html w widoku? Jak ustawić etag/fresh_when, gdy nie ma modelu, aby wygasł z eterem? Staram się znaleźć przykład lub konwencję do buforowania najłatwiejszej strony do buforowania.Buforowanie/Etag dla akcji statycznych w Railsach 4

Jedna uwaga jest taka, że ​​podczas gdy widok jest całkowicie statyczny, strona nadal ma dynamiczny pasek nawigacyjny w zależności od tego, czy użytkownik jest zalogowany, czy nie. Jak poradziłbyś sobie z taką statyczną stroną, bez odwoływania się do buforowania akcji, skoro został usunięty, a konwencja została ustawiona, aby nie używać wersji z klejnotem?

Przykład:

class HomesController < ApplicationController  
    def index 
    end 
end 

domy/index.html.erb

<div>A bunch of normal html tags with no erb</div> 

Edit: podstawie odpowiedzi użytkownika @ severin i moich własnych badań, o to co mam wymyślić jak dotąd.

class HomesController < ApplicationController  
    def index 
    fresh_when(["some-identifier", current_user, flash]) 
    end 
end 

Ponadto używam https://github.com/n8/bust_rails_etags aby zresetować wszystkie Etags po wdrożeniu ponieważ widok mogły ulec zmianie między wdraża. Wydaje mi się, że ten etag jest dość dobry, chociaż nadal jestem ciekawy, czy jest on nowy, gdy automatycznie będzie zawierał jakiś identyfikator dotyczący widoku i czy "jakiś idiotyfikator" jest konieczny? Czy to będzie problem, że czasami current_user i flash będą zerowe?

Teraz drugi punkt buforowania fragmentów statycznej treści. Zakładam, że gdybym to zrobił:

cache "v1" do 
    all my html 
end 

będę musiał pamiętać, aby zawsze zmienić identyfikator cache, gdy strona zostanie zmieniona inaczej moja aplikacja będzie służyć nieświeży treści. W jaki sposób można to zautomatyzować lub jest już obsługiwany przez szyny? Byłoby miło po prostu zachować pamięć podręczną przy ostatnim uaktualnieniu widoku lub coś sprytnego, więc nie muszę śledzić, kiedy zmieni się moja statyczna zawartość.

+0

Odpowiedziałem na drugą część pytania w mojej odpowiedzi. Jeśli cokolwiek jest niejasne lub masz dodatkowe pytania, nie wahaj się zapytać ich :) – severin

Odpowiedz

10

można ustawić etag/ostatniej modyfikacji w danych bez modelu, sprawdź dokumentację: http://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-fresh_when

Więc można zrobić coś takiego:

def index 
    fresh_when(:etag => 'some_made_up_etag', :last_modified => a_long_time.ago, :public => true) 
    render 
end 

Uwaga: nie trzeba dostarczyć etag ORAZ ostatnia modyfikacja na znaczniku czasu, możesz po prostu podać etag lub tylko ostatnią modyfikację na znaczniku czasu.

Oprócz tego chciałbym również podzielić zawartość pamięci podręcznej na całą treść widoku.

Albo można po prostu kontynuować używanie promocyjny-/page_caching według oficjalnego wtyczki/GEM: https://github.com/rails/actionpack-page_caching


pewnymi dodatkami dotyczące drugiej części pytania:

Rails dodaje treść RAILS_CACHE_ID Zmienna środowiskowa do wszystkich kluczy cache (etag i fragment cache w twoim przykładzie). Klejnot bust_rails_etags dodaje kolejną zmienną środowiskową, która wpływa tylko na etagi ...W twoim przypadku możesz po prostu usunąć gem bust_rails_etags i zaktualizować zmienną środowiskową RAILS_CACHE_ID we wszystkich swoich wdrożeniach.

Można nawet zautomatyzować aktualizację zmiennej środowiskowej RAILS_CACHE_ID dodając coś takiego w config/environment.rb:

code_revision = # ... some piece of code that gets the current revision. 
       # I'm using git and I use the following (crude) piece of 
       # to get the current revision: 
       # code_revision = `git log --pretty=format:%h -n1`.strip 
ENV['RAILS_CACHE_ID'] = code_revision 

ten sposób aktualny kod wersja jest zawsze dodawana do wszystkich kluczy pamięci podręcznej .

+0

Tak, to było zgodne z liniami, o których myślałem. Mam zaktualizowane moje pytanie z kilkoma innymi pytaniami dotyczącymi buforowania statycznego. – John

+0

Dziękuję, że odpowiedź była tym, czego szukałem. Używam tagu heroku deploy zamiast git, ponieważ heroku rzuca błąd poleceniem git, które wydaje się działać świetnie! – John

+0

szyny 4 etag są dobrze pokryte [rails 4 zombie owtlaws] (http://rails4.codeschool.com/videos) screencasts – equivalent8

Powiązane problemy