Проблемы с кэшированием действия при перезаписи URL - PullRequest
1 голос
/ 18 марта 2011

Я использую 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 }

но я не думаю, что это хороший способ решить проблемы ...

1 Ответ

0 голосов
/ 18 марта 2011

Попробуйте использовать пользовательский путь:

Вы можете изменить путь кеша действий по умолчанию, передав параметр :cache_path.Это будет передано непосредственно ActionCachePath.path_for.Это удобно для действий с несколькими возможными маршрутами, которые должны кэшироваться по-разному.Если указан блок, он вызывается с текущим экземпляром контроллера.

caches_action :show, :cache_path => { :project => 1 }

Очевидно, настроить в соответствии с вашими потребностями.См. API для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...