Sie könnten ein benutzerdefiniertes Tag im zwischengespeicherten Markup darstellen und es durch das bei jeder Anfrage gerenderte Formular ersetzen.
module CacheHelper
# Our FORM is deeply nested in the CACHED_PARTIAl, which we
# cache. It must be rendered on every request because of its
# authenticity_token by protect_from_forgery. Instead of splitting up the
# cache in multiple fragments, we replace a special tag with the custom
# form.
def cache_with_bla_form(resource, &block)
form = nil
doc = Nokogiri::HTML::DocumentFragment.parse(capture { cache("your_cache_key",&block) })
doc.css('uncachable_form').each do |element|
form ||= render(:partial => 'uncachable_form', :resource => resource)
element.replace form
end
doc.to_html
end
end
Und Ihrer Meinung nach, die Sie gerade einen leeren uncachable_form Tag machen.
<%- cache_with_bla_form resource do %>
# cachable stuff..
<uncachable_form />
# more cachable stuff
<%- end %>
Ja, kann dies als ein Hack in Betracht gezogen werden, aber es wird nicht Fälschungsschutz lösen, braucht keine JS, und verringern Sie die Performance-Gewinn von Caching nur ein bisschen. Ich denke, jemand hat ein ähnliches Muster wie eine Rack Middleware implementiert.
module CacheHelper
def cache_with_updated_csrf(*a, &block)
Nokogiri::HTML::DocumentFragment.parse(capture { cache(*a,&block) }).tap do |doc|
doc.css("input[name=#{request_forgery_protection_token}]").each { |e| e['value'] = form_authenticity_token }
end.to_html.html_safe
end
end
Und = cache_with_updated_csrf do
statt - cache do
in Ihre Ansichten verwenden:
danke für Ihre Antwort! – jacob