2013-05-23 25 views
9

Vì Rails 4 đã xóa bộ đệm trang và bộ nhớ đệm hành động, tôi tự hỏi cách Rails 4 để lưu một hành động không có biến và chỉ có html trong chế độ xem là gì? Tôi có nên phân đoạn bộ nhớ cache html tĩnh trong chế độ xem không? Làm cách nào để đặt etag/fresh_when khi không có mô hình để đặt nó hết hạn? Tôi đang đấu tranh để tìm một ví dụ hoặc quy ước để bộ nhớ đệm những gì nên là trang dễ nhất để cache.Caching/Etag cho hành động tĩnh trong Rails 4

Một lưu ý là trong khi chế độ xem hoàn toàn tĩnh, trang vẫn có thanh điều hướng động tùy thuộc vào việc người dùng có đăng nhập hay không. Làm thế nào bạn sẽ xử lý một trang tĩnh như thế này mà không cần đến bộ nhớ đệm hành động kể từ khi nó được gỡ bỏ và quy ước đã được thiết lập không sử dụng phiên bản đá quý?

Ví dụ:

class HomesController < ApplicationController  
    def index 
    end 
end 

nhà/index.html.erb

<div>A bunch of normal html tags with no erb</div> 

Edit: Dựa trên câu trả lời @ SEVERIN và nghiên cứu của riêng tôi, đây là những gì tôi đã đưa ra cho đến nay.

class HomesController < ApplicationController  
    def index 
    fresh_when(["some-identifier", current_user, flash]) 
    end 
end 

Bên cạnh đó, tôi đang sử dụng https://github.com/n8/bust_rails_etags đặt lại tất cả etags sau một triển khai vì xem có thể thay đổi giữa triển khai. Tôi nghĩ rằng điều này bao gồm các etag khá tốt mặc dù tôi vẫn còn tò mò cho dù tươi khi sẽ bao gồm một số định danh về xem tự động và liệu "một số-idnetifier" là cần thiết? Nó sẽ là một vấn đề mà đôi khi current_user và flash sẽ là nil?

Bây giờ, trên điểm thứ hai của đoạn bộ nhớ đệm trong nội dung tĩnh. Tôi giả sử nếu tôi đã làm:

cache "v1" do 
    all my html 
end 

Tôi phải nhớ luôn thay đổi định danh bộ nhớ cache khi trang được thay đổi nếu không ứng dụng của tôi sẽ phân phối nội dung cũ. Bất kỳ cách nào để tự động hóa điều này cũng như đã được xử lý bởi đường ray? Nó sẽ được tốt đẹp để chỉ bộ nhớ cache thời gian qua xem được cập nhật hoặc một cái gì đó thông minh vì vậy tôi không phải theo dõi trên khi nội dung tĩnh của tôi được thay đổi.

+0

Tôi đã trả lời phần thứ hai của câu hỏi của bạn trong câu trả lời của tôi. Nếu bất cứ điều gì là không rõ ràng hoặc nếu bạn có thêm câu hỏi, xin vui lòng không ngần ngại hỏi họ :) – severin

Trả lời

10

Bạn có thể đặt một etag/sửa đổi tại dữ liệu mà không có một mô hình mới, kiểm tra tài liệu: http://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-fresh_when

Vì vậy, bạn có thể làm điều gì đó như:

def index 
    fresh_when(:etag => 'some_made_up_etag', :last_modified => a_long_time.ago, :public => true) 
    render 
end 

Lưu ý: bạn không cần phải cung cấp một etag và một sửa đổi cuối cùng tại dấu thời gian, bạn chỉ có thể cung cấp một etag hoặc chỉ một sửa đổi cuối cùng tại dấu thời gian.

Ngoài ra, tôi cũng sẽ chia nhỏ bộ nhớ cache toàn bộ nội dung của chế độ xem.

Hoặc bạn chỉ có thể tiếp tục sử dụng action-/page_caching sử dụng plugin chính thức/đá quý: https://github.com/rails/actionpack-page_caching


Một số bổ sung liên quan đến phần thứ hai của câu hỏi của bạn:

Rails thêm nội dung của RAILS_CACHE_ID biến môi trường cho tất cả các khóa bộ nhớ cache của nó (khóa etag và khóa bộ nhớ cache trong ví dụ của bạn). Đá quý bust_rails_etags thêm một biến môi trường khác chỉ ảnh hưởng đến etags ...Vì vậy, trong trường hợp của bạn, bạn chỉ có thể loại bỏ đá quý bust_rails_etags và cập nhật biến môi trường RAILS_CACHE_ID trên tất cả các triển khai của bạn.

Bạn thậm chí có thể tự động cập nhật các biến môi trường RAILS_CACHE_ID bằng cách thêm một cái gì đó như thế này trong config/environment.rb:

code_revision = # ... some piece of code that gets the current revision. 
       # I'm using git and I use the following (crude) piece of 
       # to get the current revision: 
       # code_revision = `git log --pretty=format:%h -n1`.strip 
ENV['RAILS_CACHE_ID'] = code_revision 

Bằng cách này, mã phiên bản hiện tại luôn được thêm vào tất cả các phím bộ nhớ cache .

+0

Vâng, điều này đã được dọc theo dòng tôi đã suy nghĩ. Tôi đã cập nhật câu hỏi của mình với một số câu hỏi khác mà tôi có về bộ nhớ đệm tĩnh. – John

+0

Cảm ơn câu trả lời của bạn là những gì tôi đang tìm kiếm. Tôi đang sử dụng thẻ heroku triển khai thay vì git vì heroku đã ném một lỗi với lệnh git mà dường như làm việc tuyệt vời! – John

+0

ray 4 etag cũng được bao phủ bởi [rails 4 zombie owtlaws] (http://rails4.codeschool.com/videos) screencasts – equivalent8

Các vấn đề liên quan