Ruby on Rails: Xóa trang đã lưu trong bộ nhớ cache


81

Tôi có một ứng dụng RoR (ruby v1.8.7; rails v2.3.5) đang lưu vào bộ nhớ đệm một trang trong môi trường phát triển. Điều này sẽ không có nhiều vấn đề, nhưng các aphần tử của trang được lưu trong bộ nhớ cache không chính xác.

Tôi chưa thực hiện bất kỳ thay đổi nào đối với tệp development.rb và tôi chưa cố ý thêm bất kỳ lệnh bộ nhớ đệm nào vào bộ điều khiển.

Tôi đã thử xóa cookie của trình duyệt (Firefox 3.5 trên OSX) và bộ đệm ẩn trang cho trang web này (localhost). Tôi cũng đã khởi động lại Mongrel. Dường như không có gì để giúp đỡ.

Tôi đang thiếu gì?

Câu trả lời:


125

Dòng này trong development.rb đảm bảo rằng bộ nhớ đệm không xảy ra.

config.action_controller.perform_caching             = false

Bạn có thể xóa bộ đệm Rails bằng

Rails.cache.clear

Điều đó nói rằng - tôi không tin rằng đây là một vấn đề bộ nhớ đệm. Bạn đang thực hiện các thay đổi đối với trang và không thấy chúng được phản ánh? Có lẽ bạn không nhìn vào phiên bản trực tiếp của trang đó? Tôi đã làm điều đó một lần (đỏ mặt).

Cập nhật:

Bạn có thể gọi lệnh đó từ trong bảng điều khiển. Bạn có chắc mình đang chạy ứng dụng đang được phát triển không?

Cách thay thế duy nhất là trang bạn đang cố gắng hiển thị không phải là trang đang được hiển thị.

Nếu bạn xem đầu ra của máy chủ, bạn sẽ có thể thấy lệnh kết xuất khi trang được hiển thị tương tự như sau:

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)

Dòng đó có trong tệp development.rb. Tôi thêm lệnh đó vào đâu? Đúng. Tôi đã thực hiện các thay đổi đối với trang lẽ ra phải được hiển thị nếu trang 'đang hoạt động' - Đây là cách tôi phát hiện ra sự cố bộ nhớ đệm.
craig

Có vẻ như đó là một sai lầm ngu ngốc của tôi. blush Cảm ơn bạn đã dành thời gian và sự giúp đỡ - Tôi đã học được rất nhiều.
craig

Không vấn đề gì. Rất thích biết những gì vấn đề là - những điều này luôn khá mờ - hầu hết tất cả khi bạn đang làm cho một sai lầm ngu ngốc - Tôi hình dung tôi đang bị ràng buộc để làm cho một tương sometime sớm :)
Apie

1
Tôi đã lồng các tuyến đường cho hai mô hình liên quan. Trên một trang, tôi sử dụng đường dẫn edit_parent_child_path trong link_to. Thật không may, tôi đã bỏ qua phần tham chiếu của phụ huynh; nó là edit_parent_child_path (con), nó cần phải là edit_parent_child_path (@ parent, child).
craig

"Có lẽ bạn không nhìn vào phiên bản trực tiếp của trang đó? Tôi đã làm điều đó một lần (đỏ mặt)." LOL
Liên minh huyền thoại

113

rake tmp:cache:clear có thể là những gì bạn đang tìm kiếm.


1
Nếu môi trường là một cái gì đó khác hơn là phát triển sau đó bạn sẽ cần phải thêm (ví dụ dàn) - RAILS_ENV=staging bundle exec rake tmp:cache:clearnếu không tôi đoán nó sẽ không làm việc
poorva

điều này sẽ chỉ xóa các tệp khỏi thư mục tmp / cache. nó sẽ không xóa dữ liệu lưu trữ trong bộ nhớ cache. stackoverflow.com/questions/19017983/…
Oshan Wisumperuma

25

Tôi có thể giải quyết vấn đề này bằng cách xóa bộ nhớ cache nội dung của mình:

$ rake assets:clean

4

Kiểm tra phiên bản tĩnh của trang của bạn trong / công khai và xóa nó nếu ở đó. Khi Rails 3.x lưu trữ các trang, nó sẽ để lại một phiên bản tĩnh trong thư mục chung của bạn và tải phiên bản đó khi người dùng truy cập trang web của bạn. Điều này sẽ vẫn còn ngay cả sau khi bạn xóa bộ nhớ cache của mình.


Trong Rails 4, các mục bộ nhớ cache được đặt tại /tmp/cache/thư mục.
Ivan Chau,

Điều này đã làm các mẹo cho tôi. Tôi tiếp tục nhận được một trang kết xuất mà tôi đang sử dụng để kiểm tra một số mã mới. Bảng điều khiển máy chủ không báo cáo bất kỳ trang mới nào mà tôi yêu cầu sẽ hiển thị cùng một văn bản. Tôi đã xóa bộ nhớ cache của mình vì nghĩ rằng đó là vấn đề, nhưng điều đó không giúp được gì. Tôi đã tìm thấy trang trong thư mục chung, đã xóa nó và bây giờ nó đang hoạt động bình thường.
Reimus Klinsman

2

Nếu bạn đang làm bộ nhớ đệm phân mảnh , bạn có thể phá bộ đệm theo cách thủ công bằng cách cập nhật khóa bộ đệm của mình, như sau:

Phiên bản 1

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

Phiên bản # 2

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

Hoặc bạn có thể đặt lại bộ đệm ẩn tự động dựa trên trạng thái của một đối tượng không tĩnh, chẳng hạn như đối tượng ActiveRecord, như sau:

<% cache @user_object do %>

Với phương thức ^ này, bất kỳ khi nào đối tượng người dùng được cập nhật, bộ đệm sẽ tự động được đặt lại.


Điều gì về muốn được tự động đặt lại sau khi thay đổi chỉ cho bộ nhớ cache phân đoạn cụ thể?
Astm

@Astm đó là nơi bạn sử dụng tùy chọn cuối cùng - có một đối tượng AR như một phần của khóa bộ nhớ cache của bạn. Khi updated_atđược sửa đổi, đối tượng AR sẽ không còn khớp với khóa bộ nhớ cache, điều này sẽ khiến phân đoạn bị xóa.
jeffdill2

Tôi đã tìm thấy cách dễ dàng để tự động xóa bộ nhớ cache nếu có bất kỳ thay đổi nào xảy ra bằng cách sử dụng cú pháp <% cache (['User_Cache', user_object], expires_in: 1.hour) do%> nếu có bất kỳ thay đổi nào trong user_object, nó sẽ tự động cập nhật bộ nhớ cache
Astm

1
@Astm đúng, đó là tùy chọn cuối cùng mà tôi đã đề cập bằng cách sử dụng một đối tượng AR như một phần của khóa bộ nhớ cache.
jeffdill2

1

Nhiều cách bí truyền hơn:

Rails.cache.delete_matched("*")

Đối với Redis:

Redis.new.keys.each{ |key| Rails.cache.delete(key) }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.