Tôi đã làm theo giải pháp chung của Niklas Hofer, nhưng tôi thấy rằng việc triển khai của ông không khớp với ngữ nghĩa chính xác của trình trợ giúp bộ nhớ cache Rails. Cụ thể là, nó đã cố gắng trả lại HTML đã lưu trong bộ đệm, thay vì viết nó vào bộ đệm bằng cách sử dụng safe_concat
, đó là những gì mà trình trợ giúp Rails thực hiện.
Các Rails sử dụng helper là như thế này:
- cache do
= something
Trong khi giải pháp của ông đòi hỏi cú pháp sau:
= cache_with_updated_csrf do
= something
Đối với tính nhất quán, tôi muốn rằng những hoạt động theo cách tương tự. Do đó, tôi đã sử dụng cú pháp này:
- cache_form do
= something
Đây là triển khai của tôi. Nó cũng sẽ bỏ qua bộ nhớ đệm khi bộ nhớ đệm bị tắt, như trình trợ giúp Rails.
module CacheHelper
# Cache a form with a fresh CSRF
def cache_form(name = {}, options = nil, &block)
if controller.perform_caching
fragment = fragment_for(name, options, &block)
fragment_with_fresh_csrf = Nokogiri::HTML::DocumentFragment.parse(fragment).tap do |doc|
doc.css("input[name=#{request_forgery_protection_token}]").each { |e| e['value'] = form_authenticity_token }
end.to_html
safe_concat fragment_with_fresh_csrf
else
yield
end
nil
end
end
Nguồn
2013-05-22 20:57:48
cảm ơn phản hồi của bạn! – jacob