[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.나는 문제가 당신이보기에 조각을 캐시 할 때, 캐시 다이제스트 다이제스트 (보기 / 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.제이빌더는 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.그냥 자신이 문제에 달려 나는 그것을 다루는 접근 방식은 정규 표현식을 통해서였다. 그것은 가장 우아한 해결책되지 않을 수도 있지만, 그것을 잘 작동합니다.
그냥 자신이 문제에 달려 나는 그것을 다루는 접근 방식은 정규 표현식을 통해서였다. 그것은 가장 우아한 해결책되지 않을 수도 있지만, 그것을 잘 작동합니다.
ActionController::Base.new.expire_fragment(%r{offer_#{@offer.id}/*})
skip_digest을 추가하지만 훨씬 좋네요.
-
==============================
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 키워드 인수에 따라 다이제스트 알아낼 것입니다.
from https://stackoverflow.com/questions/17445994/rails-4-0-expire-fragment-cache-expiration-not-working by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 고안와 함께 추가 등록 필드 추가 (0) | 2020.03.02 |
---|---|
[RUBY-ON-RAILS] 어떻게 루비 온 레일즈 "꽤"형식의 JSON 출력으로 (0) | 2020.03.02 |
[RUBY-ON-RAILS] 레일에서 어떻게 핸들 배수 단지에 분할 체크 박스를 체크, 또는? (0) | 2020.03.02 |
[RUBY-ON-RAILS] "BCrypt :: 오류 :: InvalidHash"로그인 시도 (0) | 2020.03.02 |
[RUBY-ON-RAILS] 레일 : named_scope, 람다 및 블록 (0) | 2020.03.02 |