액션 캐싱은 내가 호출되는 것을 볼 수 있더라도 올바르게 만료되지 않습니다.
-
20-09-2019 - |
문제
몇 가지 액션 캐시를 만료해야 할 스위퍼가 있습니다. Debugger가 expire_action 호출 직전에 멈추지 만 실제로 조치가 만료되는 것은 아닙니다. 무슨 일이 일어날 지 아십니까?
관련 스위퍼와 컨트롤러는 다음과 같습니다.
#company_sweeper.rb ( '모델'디렉토리)
class CompanySweeper < ActionController::Caching::Sweeper
observe Company
def after_save(company)
expire_cache(company) if company.final_save && company.valid?
end
def expire_cache(company)
debugger <= #debugger stops here!
right before the call
I'm trying to make.
expire_action :controller => 'reports',
:action => 'full_report'
end
end
#reports_controller.rb
class ReportsController < ApplicationController
layout false
caches_action :full_report, :supplier_list, :service_categories
cache_sweeper :company_sweeper
def full_report
#do stuff...
end
end
내가 만료되지 않는다는 것을 아는 방식은 전체 보고서가 이전 데이터를 반환하고 거의 즉시 응답한다는 것입니다. 이상해?
해결책
당신은 있습니다 cache_sweeper
CompaniesController의 선언이 있습니까? 스위퍼는 해당 모델에서 수명주기 동작을 수행하는 컨트롤러에 포함되어야합니다. ReportsController에서 회사 인스턴스로 일을하지 않는 한 cache_sweeper
선은 거기에 속하지 않습니다.
액션 캐싱에는 암시 적 호스트 이름이 포함됩니다. 두 타격이 다른 호스트 이름으로 들어 오면 캐싱은 한 번에 이루어지고 다른 하나 아래에서 만료됩니다.
다른 팁
여기에 귀하의 질문에 실제로 답변하기에 충분한 세부 사항이 없다고 생각하지만 다음은 다음과 같습니다.
스위퍼는 Full_Report 조치와 독립적으로 발사해야하므로 회사를 변경하면 디버거 화재가 발생합니다 (올바르게 발생하는 것처럼 보입니다). 그런 다음 full_report 조치를 실행할 필요가 없으므로이 시점에서 캐시 된 파일이 제거되었는지 확인할 수 있습니다. Debugger에서 Frepire_action을 통해 Rails가 다른 이유로 만료를 건너 뛰는 지 확인하는 것이 유용 할 수 있습니다.
편집 : 오, 당신은 무엇을 알고, 나는 이것에 대해 방금 파고 들었고, expire_Action이 컨트롤러의 컨텍스트에서 실행될 것으로 보인다 (나는 ActionPack에서 GEM 소스를 읽고 있었다). '자아'가 컨트롤러라고 가정하므로 옵션을 통과합니다. 컨트롤러가 무시됩니다.
다른 예제는 옵션 대신 특정 문자열을 제공합니다 (예 : expire_action '/reports/full_report'
) 나는 개인적으로 그것을 좋아하지 않습니다 --- 라우터를 사용하지는 않지만 작동하는 것처럼 보입니다.
아마도 그 방법으로 전환하고 작동하는지 확인한 다음 디버거에서 URL_FOR에 액세스 할 수 있는지 확인해야합니다. 간단 할 수 있습니다 expire_action url_for(:controller => 'reports', :action => 'full_report')