2011-03-18 5 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) 

를 얻을 변경 로그 파일의 이름이나 성 후 캐시를 만료하면 레일 시도하기 때문에,이 캐시 만료되지 않습니다 만료일은 2-New_test_name-New_test_surname이고 2-Test_name-Test_surname이 아닙니다.

레일즈 캐싱 동작을 "easly"처리하여 작동되게하려면 어떻게해야합니까? 나는 to_param 방법을 사용하지 않는 경우 물론


P.S는 :, 그것은뿐만 아니라 작동합니다.


업데이트]

나는이

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}"}'및 다른 사람들은 "experiment "하지만 작동하지 않습니다. 어쨌든 레일스가 캐시를 만료하기 직전에 사용자 이름과 성이 변경되어서 '2-Test_name-Test_surname'이 아닌 '2-New_test_name-New_test_surname'만료를 시도하기 때문에 저에게 도움이되지 않을 것이라고 생각합니다. 어쩌면 이전의 사용자 이름과 성을 그대로 유지해야합니다. – user502052

+0

나는 가능한 해결책을 추가하는 질문을 업데이트했지만 최선의 해결책은 아닙니다. – user502052

+0

질문을 편집 한 솔루션이 최고가 아닌 이유는 무엇입니까? 그것은 당신이해야 할 일을 정확히 수행하고 내 대답을 기초로 사용합니다. –

관련 문제