2013-05-23 2 views
9

레일 4는 페이지 캐싱 및 액션 캐싱을 제거했기 때문에 뷰에 변수가없고 html 만있는 동작을 캐시하는 레일 4가 무엇인지 궁금합니다. 보기에서 정적 HTML을 조각화해야합니까? 기한이 만료되도록 설정할 모델이 없을 때 etag/fresh_when을 어떻게 설정합니까? 캐시 할 가장 쉬운 페이지를 캐싱하는 예제 또는 규칙을 찾기 위해 고심하고 있습니다.레일에서의 정적 동작을위한 캐싱/Etag 4

보기가 완전히 정적이지만 페이지에 사용자가 로그인되어 있는지 여부에 따라 동적 탐색 막대가 여전히 있습니다. 액션 캐싱을 사용하지 않고이 정적 페이지를 어떻게 처리하겠습니까? 제거 된 이후 규칙은 보석 버전을 사용하지 않도록 설정 되었습니까?

예 :

class HomesController < ApplicationController  
    def index 
    end 
end 

가정/index.html.erb

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

편집 :는 @ 세브린의 대답은 내 자신의 연구를 바탕으로, 여기에 내가 함께 온 것입니다 지금까지. 또한

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

, 나는보기가 전개함에 사이에 변경되었을 수 있기 때문에 배포 한 후 모든 ETag를를 다시 https://github.com/n8/bust_rails_etags을 사용하고 있습니다. 나는 이것이 항상 etag을 잘 커버한다고 생각하지만, 나는 언제쯤에는 자동적으로 뷰에 대한 어떤 식별자를 포함 할 것인지, 그리고 "some-idnetifier"가 필요한지 여부가 궁금하다. 때때로 current_user 및 flash가 0이 될 수있는 문제가됩니까?

정적 콘텐츠를 캐싱하는 두 번째 부분에 대해 알아 보겠습니다. 내가 그랬다면 내가 있으리라 믿고있어 :

cache "v1" do 
    all my html 
end 

내가 페이지 그렇지 않으면 내 응용 프로그램이 오래된 콘텐츠를 제공 할 변경 될 때 항상 캐시 ID를 변경해야 할 것입니다. 이 방법을 자동화하는 방법이나 이미 레일로 처리 중입니까? 뷰를 업데이트 한 마지막 시간이나 영리한 내용을 캐싱하는 것이 좋으므로 정적 컨텐트가 변경된 시점을 추적 할 필요가 없습니다.

+0

나는 내 대답에서 질문의 두 번째 부분에 응답했습니다. 불명확하거나 더 이상의 질문이 있으면 주저하지 말고 물어보십시오. – severin

답변

10

당신은 모델없이 데이터를 변성 ETAG/마지막을 설정 한 문서를 확인할 수 있습니다

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

참고 : http://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-fresh_when

그래서 당신이 뭔가를 할 수있는 당신이 제공 할 필요가 없습니다를 마지막으로 timestamp에서 수정 된 etag 및 마지막으로 timestamp에서 마지막으로 수정 된 etag 만 제공 할 수 있습니다.

이 외에도보기의 전체 내용을 조각화합니다.

아니면 그냥 공식 플러그인/보석 사용/page_caching를 Action (작업) 계속 사용할 수 있습니다 : 두 번째 질문의 일부에 대한 https://github.com/rails/actionpack-page_caching


일부 추가 :

레일은 RAILS_CACHE_ID의 내용을 추가 환경 변수를 모든 캐시 키 (예제의 etag 및 fragment 캐시 키)에 추가하십시오. bust_rails_etags 젬은 etags에만 영향을주는 또 다른 환경 변수를 추가합니다 ...따라서 귀하의 경우에는 bust_rails_etags gem을 제거하고 모든 배치에서 RAILS_CACHE_ID 환경 변수를 업데이트 할 수 있습니다.

심지어 설정/environment.rb에이 뭔가를 추가하여 RAILS_CACHE_ID 환경 변수의 업데이트를 자동화 할 수 있습니다 :

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 

이러한 방식으로, 현재 코드 수정은 항상 모든 캐시 키에 추가 .

+0

예, 이것은 내가 생각하고있는 라인을 따라있었습니다. 정적 캐싱에 대해 몇 가지 질문을 추가하여 질문을 업데이트했습니다. – John

+0

당신의 대답은 제가 찾고있는 것이 었습니다. 나는 heroku가 git 명령으로 오류를 던지고 있기 때문에 git 대신 heroku deploy tag를 사용하고 있습니다. – John

+0

rails 4 etag는 [rails 4 zombie owllaws] (http://rails4.codeschool.com/videos) 스크린 캐스트에서 잘 설명됩니다. – equivalent8