Rails Caches_Action은 Before_Filters를 건너 뜁니다
-
11-12-2019 - |
문제
나는 쇼 조치를 캐싱하는 컨트롤러가 있습니다. Show Action은 사용자가 로그인하지 않은 경우, 현재 그룹의 구성원이 아닌 경우 필터를 실행하기 전에 필터를 실행하고 리디렉션하는 데 필요한 보안 전송 필터가 있습니다. 필터가 캐싱을 켜지 않았을 때 완벽하게 작동하지만 FRAIG FRAY FILTERS에서 스위치를 돌리면 스위치가 더 이상 실행되지 않으면 (내 디버거 호출이 닿지 않음)
필터가 캐시 된 작업에 대해 호출되기 전에 항상 페이지 캐싱 및 액션 캐싱 간의 주요 차이점이 나타납니다. 이것은 Razing 캐싱에 대한 튜토리얼 섹션을 뒤로 백업합니다 :
액션 캐싱은 들어오는 웹 요청이 웹 서버에서 레일 스택 및 액션 팩으로 이동하여 캐시가 제공되기 전에 필터를 실행하기 전에 필터를 실행할 수 있도록 페이지 캐싱처럼 작동합니다. 이렇게하면 캐시 된 복사본에서 출력 결과를 여전히 제공하는 동안 인증 및 기타 제한이 실행될 수 있습니다.
왜 필터가 불리기 전에 왜 그렇지 않습니까?
My Setup에 대한 비트 : Rails 3.1 인증을위한 고안을 사용합니다. 나는 Memcached 매장을 위해 Dalli Gem을 사용하고 있습니다.
여기에 내 코드를 요약 한 몇 가지 코드가 있습니다 (많은 크루프 트 컷 아웃) :
.class GroupsController < ApplicationController caches_action :show cache_sweeper :group_sweeper before_filter :authenticate_user!, :except => [:index] before_filter :init_group, :except => [:new, :create, :index] before_filter :requires_group_membership, :except => [:new, :create, :index] def show end private def requires_group_membership if current_user and !@group.users_active.index(current_user).nil? return true else redirect_to :root return false end end def init_group @group = current_user.active_groups.find_by_id(params[:id]) if @group.nil? redirect_to :root return false end end
그래서, 전에이 행동을 보았습니까? 필터와 액션 캐싱이 어떻게 작동하기 전에 어떻게 작동하는지에 대한 구멍이 있습니까? 또는 아마도 GEM 버전의 이상한 콤보로 일어나는 이상한 밥을 가지고 있습니까?
[편집]
흥미롭게도 방금 Return Value가 체인을 따라 더 이상 메소드가 실행되었는지 여부에 영향을 미치지 않으며 리디렉션 또는 렌더링이 호출되는지 여부입니다.
[편집 2]
i 앱을 Rails 3.2.3으로 업그레이드하여 효과가 있지만 문제를 해결하지 못했습니다. 내가 발견 한 무언가는 ApplicationController에 정의 된 필터가 호출되지만 My GroupScontroller의 항목이 아니라는 것입니다.
해결책
잘 캐싱에 대한 새로운 티 듀드를 배우는 데는 매우 시간 이외의 방법이었습니다.
실행하려는 before_filters를 에 호출해야한다는 것이 밝혀졌습니다.나는 캐시 액션을 내 수업의 첫 번째 것 중 하나로 배치했다.이것은 Caches_Action 이후 / 이후에 등장한 것처럼 모든 것이 전면적으로 실행되지 않고 Caches_Action이 코드 실행을 중지 않고 캐시 된 결과를 제공합니다. 팬 Thomakos님께 왔습니다 ruby 문서가 아니거나 나는 그것을 훑어 낸 정보 의이 정보가 들어있는 그의 답변 나는이 작은 맹목으로 인해 잃어버린 시간을 되돌려 놓을 수있게 되었다면이 정보를 문서에 추가 할 수 있도록이 정보를 삭제할 것입니다.