2012-05-04 34 views
21

Tôi đang sử dụng ứng dụng Memcached with Heroku cho ứng dụng Rails 3.1. Tôi đã có một lỗi và những điều sai trái được hiển thị - các tham số không chính xác cho bộ nhớ cache.Xóa bộ nhớ cache theo cách thủ công trong Rails

Tôi có điều này:

<% cache("foo_header_cache_#{@user.id}") do %> 

tôi loại bỏ các bộ nhớ đệm đoạn và đẩy lên Heroku và các dữ liệu xấu đi.

Và sau đó tôi đã thay đổi nó để:

<% cache("foo_header_cache_#{@foo.id}") do %> 

Tuy nhiên, khi tôi điều chỉnh các thông số, từ @user để @foo, các [không đúng] phiên bản cache cũ cho thấy một lần nữa (thay vì làm mới với các dữ liệu chính xác).

Làm cách nào tôi có thể hết hạn theo cách thủ công này hoặc loại bỏ dữ liệu xấu này đang hiển thị?

Trả lời

39

tôi đã kết thúc bằng tay xóa toàn bộ bộ nhớ cache bằng cách vào đường ray giao diện điều khiển và sử dụng lệnh:

Rails.cache.clear 
+3

Câu trả lời của John Kloian cho phép bạn hết hạn một đoạn. Nếu bạn có một trang web nhận được lưu lượng truy cập hợp lý và dựa vào bộ nhớ đệm, mọi thứ hết hạn có thể dẫn đến tải trang hoặc lỗi hết thời gian chờ rất chậm khi bộ nhớ cache được làm nóng. –

20

Từ bảng điều khiển đường ray:

Rails.cache.delete 'FRAGMENT-NAME' 
+4

Đây là câu trả lời đúng. Người được chấp nhận đang sử dụng một khẩu súng ngắn để giết một con ruồi. –

7

Từ giao diện điều khiển:

Bạn có thể chạy này (ví dụ. nếu bạn biết id là '1')

ActionController::Base.new.expire_fragment("foo_header_cache_1") 

Để sử dụng Rails.cache.delete bạn cần biết tên phân đoạn. Trong trường hợp của bạn, nó sẽ là

Rails.cache.delete("views/foo_header_cache_1") # Just add 'views/' to the front of the string 

Nếu bạn có một chìa khóa bộ nhớ cache mảng dựa trên sử dụng các đối tượng, chẳng hạn như:

cache([:foo_header_cache, @user]) 

Sau đó, bạn có thể lấy tên mảnh như vậy

ActionController::Base.new.fragment_cache_key([:foo_header_cache, @user]) 

Tên bao gồm thời gian idupdated_at từ bất kỳ đối tượng nào (đến yyyymmddhhmmss). Nó sẽ giống như "views/foo_header_cache/users/1-20160901021000"

Hoặc đơn giản là xóa nó bằng cách sử dụng mảng.

ActionController::Base.new.expire_fragment([:foo_header_cache, @user]) 
Các vấn đề liên quan