2012-05-19 33 views
12

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.

Trả lời

25

Vâng đây là một cách rất thời gian để tìm hiểu một miếng ngon mới về bộ nhớ đệm.

Nó chỉ ra rằng bạn phải thực hiện cuộc gọi đến caches_action SAU before_filters mà bạn muốn chạy. Tôi đã có hành động lưu trữ như là một trong những điều đầu tiên trong lớp của tôi vì vậy tất cả các bộ lọc trước đây không được chạy như chúng ở dưới nó.

Nhờ Pan Thomakos cho his answer chứa thông tin đá quý này - không có trong tài liệu ruby ​​HOẶC tôi đã lướt qua nó. Tôi sẽ kiên trì để có thông tin này được thêm vào tài liệu khi tôi đã quản lý để vuốt lại thời gian bị mất do điểm mù nhỏ này.

Các vấn đề liên quan