Tôi có một bộ điều khiển trong đó tôi đang lưu vào bộ đệm hành động hiển thị. Hành động hiển thị có một số bộ lọc trước để bảo mật có nghĩa là thực thi và chuyển hướng nếu người dùng không đăng nhập, không phải là thành viên của nhóm hiện tại, v.v. Trước khi bộ lọc hoạt động hoàn hảo khi tôi chưa bật bộ nhớ đệm, nhưng khi tôi lật công tắc để chuyển bộ nhớ đệm trên các bộ lọc trước không còn được thực hiện nữa (các cuộc gọi trình gỡ lỗi của tôi không bị nhấn).Rails caches_action đang bỏ qua before_filters
Nó luôn luôn là sự hiểu biết của tôi rằng trước khi các bộ lọc được gọi cho hành động được lưu trong bộ nhớ cache, đây là sự khác biệt chính giữa bộ nhớ đệm trang và bộ nhớ đệm hành động. Đây được hỗ trợ bởi các Rails Caching Tutorial section on action caching mà đọc:
Action Caching hoạt động giống như trang Caching trừ một thực tế là yêu cầu web đến không đi từ máy chủ web để ngăn xếp Rails và gói hành động để trước khi lọc có thể chạy trên đó trước khi bộ nhớ cache được phân phát. Điều này cho phép xác thực và hạn chế khác được chạy trong khi vẫn phục vụ kết quả đầu ra từ một bản sao được lưu trong bộ nhớ cache.
Vậy tại sao bộ lọc của tôi không được gọi trước?
Một chút về thiết lập của tôi: Đường ray 3.1 sử dụng Devise để xác thực. Tôi đang sử dụng đá quý dalli cho một cửa hàng memcached.
Dưới đây là một số mã tóm tắt mã của tôi (rất nhiều cruft cắt ra):
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 [email protected]_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
Vì vậy, có ai nhìn thấy hành vi này trước đây chưa? Tôi có một lỗ hổng trong sự hiểu biết của tôi về cách trước khi bộ lọc và bộ nhớ đệm hành động được cho là hoạt động không? Hoặc có lẽ tôi có một số voodo lạ xảy ra với một combo kỳ lạ của các phiên bản đá quý?
[EDIT]
Điều thú vị là tôi chỉ biết được rằng giá trị trả về đã không có hiệu lực thi hành hay không phương pháp hơn nữa dọc theo chuỗi đang chạy, nó là liệu một chuyển hướng hoặc làm cho được gọi là.
[sửa 2]
tôi nâng cấp ứng dụng của tôi để ray 3.2.3 để xem nếu nó có ảnh hưởng, nhưng không khắc phục được vấn đề. Một cái gì đó mà tôi đã phát hiện ra là trước khi các bộ lọc được định nghĩa trong ApplicationController đang nhận được gọi, nhưng những người trong GroupsController của tôi là không.