【发布时间】:2011-03-18 18:06:17
【问题描述】:
我正在使用 Ruby on Rails 3,当我使用 to_param 方法重写模型中的 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。
如何“轻松”处理 Rails 缓存行为以使其正常工作?
P.S.:当然,如果我不使用to_param 方法,它也可以工作。
更新
我可以做这样的事情
caches_action :show, :cache_path => Proc.new { |c| 'users/' + c.params[:id].split('-').first }
但我认为这不是解决问题的好方法......
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 caching url