Ruby on Rails : 캐시 된 페이지 지우기


81

개발 환경에서 페이지를 캐싱하는 RoR 애플리케이션 (ruby v1.8.7, rails v2.3.5)이 있습니다. 이것은 그다지 문제가되지 않지만 캐시 된 페이지의 a요소가 올바르지 않습니다.

development.rb 파일을 변경하지 않았으며 고의로 컨트롤러에 캐싱 명령을 추가하지 않았습니다.

이 사이트 (localhost)에 대한 브라우저 (OSX의 Firefox 3.5) 쿠키 및 페이지 캐시를 지우려고했습니다. Mongrel도 다시 시작했습니다. 도움이되지 않는 것 같습니다.

내가 무엇을 놓치고 있습니까?

답변:


125

development.rb의이 줄은 캐싱이 발생하지 않도록합니다.

config.action_controller.perform_caching             = false

다음을 사용하여 Rails 캐시를 지울 수 있습니다.

Rails.cache.clear

즉, 이것이 캐싱 문제라고 확신하지 않습니다. 페이지를 변경했지만 반영되지 않았습니까? 해당 페이지의 라이브 버전을보고 있지 않습니까? 나는 그것을 한 번했다 (홍조).

최신 정보:

콘솔에서 해당 명령을 호출 할 수 있습니다. 개발중인 애플리케이션을 실행하고 있습니까?

유일한 대안은 렌더링하려는 페이지가 렌더링중인 페이지가 아니라는 것입니다.

서버 출력을 보면 페이지가 다음과 유사하게 렌더링 될 때 render 명령을 볼 수 있습니다.

Rendered shared_partials/_latest_featured_video (31.9ms)
Rendered shared_partials/_s_invite_friends (2.9ms)
Rendered layouts/_sidebar (2002.1ms)
Rendered layouts/_footer (2.8ms)
Rendered layouts/_busy_indicator (0.6ms)

이 줄은 development.rb 파일에 있습니다. 그 명령을 어디에 추가합니까? 예. 페이지가 '라이브'인 경우 표시되어야하는 페이지를 변경했습니다. 이것이 캐싱 문제를 발견 한 방법입니다.
craig

제 입장에서는 멍청한 실수 인 것 같습니다. 홍당무 시간과 도움을 주셔서 감사합니다 - 나는 많은 것을 배울했다.
craig

문제 없어요. 문제가 무엇인지 알고 싶어요-이런 것들은 항상 꽤 모호합니다-무엇보다 당신이 바보 같은 실수를 할 때-나는 언젠가 같은 실수를하게 될
것이라고 생각합니다

1
두 개의 관련 모델에 대한 중첩 경로가 있습니다. 한 페이지에서 link_to의 edit_parent_child_path를 사용합니다. 불행히도 저는 부모의 언급을 생략했습니다. edit_parent_child_path (child) 였고 edit_parent_child_path (@ parent, child) 여야했습니다.
craig

"아마도 그 페이지의 라이브 버전을보고 있지 않습니까? 한 번만 해봤습니다 (홍조)." LOL 이것은 나에게 일어났다 하하
Robert Vunabandi

113

rake tmp:cache:clear 당신이 찾고있는 것일 수 있습니다.


1
환경 개발 이외 인 경우에 당신은 (예를 들어 준비에 대한) 추가해야합니다 - RAILS_ENV=staging bundle exec rake tmp:cache:clear그렇지 않으면 내가 그것을 작동하지 않습니다 생각
poorva

이것은 tmp / cache 디렉토리에서 파일을 제거합니다. 캐시 저장소 데이터는 지워지지 않습니다. stackoverflow.com/questions/19017983/…
Oshan Wisumperuma

25

자산 캐시를 정리하여이 문제를 해결할 수있었습니다.

$ rake assets:clean

4

/ public에서 페이지의 정적 버전을 확인하고있는 경우 삭제합니다. Rails 3.x는 페이지를 캐시 할 때 공용 폴더에 정적 버전을 남겨두고 사용자가 사이트를 방문 할 때로드합니다. 이것은 캐시를 지운 후에도 유지됩니다.


Rails 4에서는 /tmp/cache/디렉토리 에있는 항목을 캐시합니다 .
Ivan Chau 2015

이것은 나를 위해 트릭을했습니다. 새 코드를 테스트하는 데 사용하던 렌더링 페이지가 계속 표시되었습니다. 서버 콘솔은 동일한 텍스트를 렌더링하도록 요청한 새 페이지를보고하지 않았습니다. 문제라고 생각하고 캐시를 지 웠지만 도움이되지 않았습니다. 공용 폴더에서 페이지를 찾아 삭제 한 다음 제대로 작동합니다.
Reimus Klinsman 2015

2

조각 캐싱을 수행하는 경우 다음 과 같이 캐시 키를 업데이트하여 수동으로 캐시를 중단 할 수 있습니다.

버전 # 1

<% cache ['cool_name_for_cache_key', 'v1'] do %>

버전 # 2

<% cache ['cool_name_for_cache_key', 'v2'] do %>

또는 다음과 같이 ActiveRecord 객체와 같은 비 정적 객체의 상태에 따라 캐시를 자동으로 재설정 할 수 있습니다.

<% cache @user_object do %>

이 ^ 메서드를 사용하면 사용자 개체가 업데이트 될 때마다 캐시가 자동으로 재설정됩니다.


특정 조각 캐시에 대해서만 변경 후 자동으로 재설정되기를 원하십니까?
Astm

마지막 옵션을 사용하는 @Astm – 캐시 키의 일부로 AR 개체를 사용합니다. 이 때 updated_at수정되면, AR 객체는 더 이상 조각이 recached되게합니다 캐시 키를 일치하지 않습니다.
jeffdill2

<% cache ([ 'User_Cache', user_object], expires_in : 1.hour) do %> 구문을 사용하여 변경 사항이 발생하면 자동으로 캐시를 지우는 쉬운 방법을 찾았습니다. user_object에 변경 사항이 있으면 자동으로 업데이트됩니다. cache
Astm

1
@Astm 맞습니다. AR 개체를 캐시 키의 일부로 사용하여 언급 한 마지막 옵션입니다.
jeffdill2

1

더 난해한 방법 :

Rails.cache.delete_matched("*")

Redis의 경우 :

Redis.new.keys.each{ |key| Rails.cache.delete(key) }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.