2011-03-18 49 views
1

我正在使用Ruby on Rails 3,並且在使用to_param方法重寫模型中的URL時存在緩存問題。當我重寫URL時緩存動作時遇到問題

在我的用戶模型中,我有:

class User < ActiveRecord::Base 
    def to_param # Rewrites URL 
    "#{self.id}-#{self.name}-#{self.surname}" 
    end 

    ... 
end 

在用戶控制我有:

class UsersController < ApplicationController 
    caches_action :show 

    def show 
    ... 
    end 
end 

在用戶清掃車,我有:

class UsersSweeper < ActionController::Caching::Sweeper 
    observe User 

    def after_save(user) 
    clear_users_cache(user) 
    end 

    def after_destroy(user) 
    clear_users_cache(user) 
    end 

    def clear_users_cache(user) 
    expire_action :controller => :users, :action => :show, :id => user 
    end 
end 

現在,當我瀏覽我得到的日誌文件中的用戶顯示頁面:

Write fragment views/<my_site_name>/users/2-Test_name-Test_surname (0.3ms) 

當我到期緩存的變化在日誌文件名或姓後,我得到

Expire fragment views/<my_site_name>/users/2-New_test_name-New_test_surname (0.3ms) 

因此,由於數據發生變化時,它不會過期緩存由於Rails嘗試到期2-New_test_name-New_test_surname而不是2-Test_name-Test_surname

如何「easly」處理Rails緩存行爲以使其工作?


P.S:當然,如果我不使用to_param方法,它的工作原理也是如此。


修訂

我可以做這樣的事情

caches_action :show, :cache_path => Proc.new { |c| 'users/' + c.params[:id].split('-').first } 

,但我不認爲這是解決事情的好辦法...

回答

0

嘗試使用自定義路徑:

您可以通過傳遞:cache_path選項來設置修改默認操作緩存路徑。這將直接傳遞給ActionCachePath.path_for。對於應該緩存不同的多條可能路由的操作而言,這很方便。如果給出塊,則使用當前控制器實例調用該塊。

caches_action :show, :cache_path => { :project => 1 } 

顯然定製,以滿足您的需求。有關更多信息,請參閱API

+0

我嘗試做一些像':cache_path => {:project =>「#{@ user.id} - #{@ user.firstname}-#{@user.lastname}」}'等實驗「但它不起作用。無論如何,我認爲這不會幫助我,因爲用戶名和姓在Rails過期之前發生變化,所以它會嘗試過期'2-New_test_name-New_test_surname'而不是'2-Test_name-Test_surname'。也許我必須保留\舊的用戶名和姓氏值。 – user502052 2011-03-18 09:42:58

+0

我更新了問題,添加了一個可能但不是最好的解決方案。 – user502052 2011-03-18 10:07:31

+0

爲什麼你編輯你的問題的解決方案不是最好的?它完全符合你需要做的,並以我的答案爲基礎。 – 2011-03-23 22:40:49