Я использую Ruby on Rails 3, и у меня возникает проблема с кэшированием, когда я переписываю URL в модели с помощью метода to_param
.
В моей модели пользователя у меня есть:
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
У пользователя Sweeper:
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 }
но я не думаю, что это хороший способ решить проблемы ...