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 }
,但我不認爲這是解決事情的好辦法...
我嘗試做一些像':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
我更新了問題,添加了一個可能但不是最好的解決方案。 – user502052 2011-03-18 10:07:31
爲什麼你編輯你的問題的解決方案不是最好的?它完全符合你需要做的,並以我的答案爲基礎。 – 2011-03-23 22:40:49