복붙노트

[RUBY-ON-RAILS] 작동하지 않는 4.0 expire_fragment / 캐시 만료 레일

RUBY-ON-RAILS

작동하지 않는 4.0 expire_fragment / 캐시 만료 레일

나는 레일의 캐싱 기능을 사용하려고 시도되었지만, 만료 된 것으로 보인다 있지만 좀 캐시 조각을 만료 할 수없는입니다. (가) 튜토리얼 사이트를 레일에 뾰족한 아웃로 '러시아어 인형 캐싱'을 사용하여, 나는이 구성을 사용하고 있습니다

<% cache "all_available_releases" do %>
 <% @releases.each do |release| %>
  <% cache(release) do %>
   <html code with>
   <%ruby code @release.name blah blah blah%>
  <%end%>
 <%end%>
<%end%>    

I는 I가 만료 단편 ( "all_available_releases")를 expire_fragment를 사용 release_controller.rb 컨트롤러의 외부 캐시 만료. 나는 업데이트 또는 삭제하거나 항목을 추가하는 컨트롤러의 모든 방법을 사용합니다.

이 만료 조각이 등록됩니다 있지만, 5 줄 이상 만료 된 단편을 읽어 및 말아야 동안 사용에 WEBrick의 로그입니다. A가 전화를 파괴 한 후이 예입니다.

Processing by ReleasesController#destroy as HTML
  Parameters: {"authenticity_token"=>"***/***/********************+********=", "id"=>"2"}
  Release Load (0.1ms)  SELECT "releases".* FROM "releases" WHERE "releases"."id" = ? LIMIT 1  [["id", "2"]]
   (0.1ms)  begin transaction
  SQL (2.0ms)  DELETE FROM "releases" WHERE "releases"."id" = ?  [["id", 2]]
   (148.0ms)  commit transaction
Expire fragment views/all_available_releases (0.1ms)
Redirected to http://127.0.0.1:3000/releases
Completed 302 Found in 180ms (ActiveRecord: 150.2ms)


Started GET "/releases" for 127.0.0.1 at 2013-07-03 13:09:51 +0300
Processing by ReleasesController#index as HTML
Read fragment views/all_available_releases/41cb0a928326986f35f41c52bb3d8352 (0.1ms)
  Rendered releases/index.html.erb within layouts/application (0.6ms)
Completed 200 OK in 5ms (Views: 4.0ms | ActiveRecord: 0.0ms)

난 ( "all_available_releases")를 Rails.cache.delete를 사용하여 시도하고 중 하나가 작동하지 않았다.

내 html.erb에서 <% 캐시 "all_available_releases"%> (하나의 <% 엔드 %를>) 삭제하면 캐싱은 벌금을 작동 할 때마다 그것을해야 만료됩니다.

해결법

  1. ==============================

    1.나는 문제가 당신이보기에 조각을 캐시 할 때, 캐시 다이제스트 다이제스트 (보기 / all_available_releases)를 사용하지 않는 캐시 키 (보기 / all_available_releases / 41cb0a928326986f35f41c52bb3d8352), 그러나 expire_fragment에 추가되고 있음을 믿습니다.

    나는 문제가 당신이보기에 조각을 캐시 할 때, 캐시 다이제스트 다이제스트 (보기 / all_available_releases)를 사용하지 않는 캐시 키 (보기 / all_available_releases / 41cb0a928326986f35f41c52bb3d8352), 그러나 expire_fragment에 추가되고 있음을 믿습니다.

    당신이 skip_digest 추가하는 경우 : 뷰의 캐시 호출에 충실 그것은 사용되는 소화 방지해야한다.

    <% cache "all_available_releases", skip_digest: true do %>
     <% @releases.each do |release| %>
      <% cache(release) do %>
       <html code with>
       <%ruby code @release.name blah blah blah%>
      <%end%>
     <%end%>
    <%end%>
    

    캐시 다이제스트은 자동 캐시 만료와 함께 사용하기위한 것입니다. 수동으로 캐시 키를 만료해야하는 경우 당신은 캐시 다이제스트를 사용할 수 없습니다.

  2. ==============================

    2.제이빌더는 skip_digest을 지원하지 않습니다. 많은 실패 접근 방식에 방법 후, 나는 그것이 매우 관련이로하지 않는 레일 위와 같이 문제가 볼 수 있지만 여기 내 대답을 공유하기로 결정했다.

    제이빌더는 skip_digest을 지원하지 않습니다. 많은 실패 접근 방식에 방법 후, 나는 그것이 매우 관련이로하지 않는 레일 위와 같이 문제가 볼 수 있지만 여기 내 대답을 공유하기로 결정했다.

    여기 DHH은 본질적으로 그가 명시 적으로 fragment_caches을 만료 할 수없는 사람을 알려주는 관련 Q / 문제입니다. https://github.com/rails/cache_digests/issues/35 모든 사각형 그래서 여기에없는이 주위에 방법 :

    class MenuController
      def index
        json = Rails.cache.fetch('clients') do
          @items = Menu.all
          render_to_string( template: 'menu/index', locals: {items: @items})
        end
        render json: json
      end
    end
    

    당신은 명시 적으로 관찰자처럼,이 어디서나 만료 될 수 있습니다

    class MenuCacheObserver < ActiveRecord::Observer
      observe :menu, :menuitem, :menusubnavigation
    
      def after_save obj
        Rails.cache.delete(:clients)
      end
    end
    

    몇 가지 경우에 이것은 의미가 있습니다. 일반적인 메모에서, 대부분의 경우 json.cache처럼, 캐시 입력의 객체를 사용해야합니다! @my_object는 제이빌더보기를 포장 않습니다. 객체 변경에 updated_at이 무효화 것이다 그런 식으로.

  3. ==============================

    3.그냥 자신이 문제에 달려 나는 그것을 다루는 접근 방식은 정규 표현식을 통해서였다. 그것은 가장 우아한 해결책되지 않을 수도 있지만, 그것을 잘 작동합니다.

    그냥 자신이 문제에 달려 나는 그것을 다루는 접근 방식은 정규 표현식을 통해서였다. 그것은 가장 우아한 해결책되지 않을 수도 있지만, 그것을 잘 작동합니다.

    ActionController::Base.new.expire_fragment(%r{offer_#{@offer.id}/*})
    

    skip_digest을 추가하지만 훨씬 좋네요.

  4. ==============================

    4.사실 : 레일에서 5 나는 skip_digest에 의지하지 않고 캐시를 체포하기 위해 다음과 같은 조치를 취했다. 우리의 문제는 국제화 문자열의 값을 변경하면 캐시가 자동으로 체포되지 것 때문에 소화 계산 된 캐시에 반영되지 않는 것이 었습니다.

    사실 : 레일에서 5 나는 skip_digest에 의지하지 않고 캐시를 체포하기 위해 다음과 같은 조치를 취했다. 우리의 문제는 국제화 문자열의 값을 변경하면 캐시가 자동으로 체포되지 것 때문에 소화 계산 된 캐시에 반영되지 않는 것이 었습니다.

    여기서, 캐시 블록이 정의되어있는 도면이다 :

    / views/layouts/_footer.html.slim
    - cache :footer do
      span= t('shared.footer')
    

    그런 다음 레일에 내가 도망 콘솔 :

    fragment = ActionController::Base.new.view_context.cache_fragment_name(:footer, virtual_path: 'layouts/_footer.html.slim')
    ActionController::Base.new.expire_fragment(fragment)
    

    cache_fragment_name는이 virtual_path 키워드 인수에 따라 다이제스트 알아낼 것입니다.

  5. from https://stackoverflow.com/questions/17445994/rails-4-0-expire-fragment-cache-expiration-not-working by cc-by-sa and MIT license