2011-03-18 51 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