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