Ruby on Rails 5.2 - ActionView::Helpers::CacheHelper

मॉड्यूल ActionView :: हेल्पर्स :: CacheHelper




ruby

मॉड्यूल ActionView :: हेल्पर्स :: CacheHelper

सार्वजनिक प्रवृत्ति के तरीके

कैश (नाम = {}, विकल्प = {}) {|| ...} स्रोत दिखाएं
# File actionview/lib/action_view/helpers/cache_helper.rb, line 166
def cache(name = {}, options = {}, &block)
  if controller.respond_to?(:perform_caching) && controller.perform_caching
    name_options = options.slice(:skip_digest, :virtual_path)
    safe_concat(fragment_for(cache_fragment_name(name, name_options), options, &block))
  else
    yield
  end

  nil
end

यह सहायक एक संपूर्ण क्रिया या पृष्ठ के बजाय किसी दृश्य के टुकड़े को कैशिंग करने के लिए एक विधि को उजागर करता है। यह तकनीक मेनू, नए विषयों की सूची, स्थिर HTML टुकड़े और इसी तरह उपयोगी कैशिंग टुकड़े हैं। यह विधि एक ब्लॉक लेता है जिसमें वह सामग्री होती है जिसे आप कैश करना चाहते हैं।

इसका उपयोग करने का सबसे अच्छा तरीका है कि मेम्केच्ड या रेडिस जैसे कैश स्टोर के शीर्ष पर रीसायकल की-आधारित कैश एक्सपायरी करना जो स्वचालित रूप से पुरानी प्रविष्टियों को किक करेगा।

इस पद्धति का उपयोग करते समय, आप कैश निर्भरता को कैश के नाम के रूप में सूचीबद्ध करते हैं, जैसे:

<% cache project do %>
  <b>All the topics on this project</b>
  <%= render project.topics %>
<% end %>

यह दृष्टिकोण यह मान लेगा कि जब कोई नया विषय जोड़ा जाता है, तो आप इस परियोजना को स्पर्श करेंगे। इस कॉल से उत्पन्न कैश कुंजी कुछ इस प्रकार होगी:

views/template/action.html.erb:7a1156131a6928cb0026877f8b749ac9/projects/123
      ^template path           ^template tree digest            ^class   ^id

यह कैश कुंजी स्थिर है, लेकिन यह प्रोजेक्ट रिकॉर्ड से प्राप्त कैश संस्करण के साथ संयुक्त है। जब प्रोजेक्ट update_at को छुआ जाता है, तो कैश_वॉर्स बदलता है, भले ही कुंजी स्थिर रहे। इसका मतलब यह है कि एक पारंपरिक कुंजी-आधारित कैश समाप्ति दृष्टिकोण के विपरीत, आप कैश ट्रैश, अप्रयुक्त कुंजियों को उत्पन्न नहीं करेंगे, केवल इसलिए कि निर्भर रिकॉर्ड अपडेट किया गया है।

यदि आपका टेम्पलेट कैश कई स्रोतों पर निर्भर करता है (चीजों को सरल रखने के लिए इससे बचने की कोशिश करें), तो आप इन सभी निर्भरताओं को एक सरणी के भाग के रूप में नाम दे सकते हैं:

<% cache [ project, current_user ] do %>
  <b>All the topics on this project</b>
  <%= render project.topics %>
<% end %>

इसमें कैश रिकॉर्ड के हिस्से के रूप में दोनों रिकॉर्ड शामिल होंगे और उनमें से किसी एक को अपडेट करने से कैश समाप्त हो जाएगा।

खाका पचा

कैश कुंजी में जोड़ा गया टेम्पलेट डाइजेस्ट संपूर्ण टेम्पलेट फ़ाइल की सामग्री का एमडी 5 लेकर गणना की जाती है। यह सुनिश्चित करता है कि जब आप टेम्प्लेट फ़ाइल बदलते हैं तो आपके कैश अपने आप समाप्त हो जाएंगे।

ध्यान दें कि MD5 संपूर्ण टेम्प्लेट फ़ाइल से लिया गया है, न कि केवल कैश कै एंड / कॉल के भीतर क्या है। तो यह संभव है कि उस कॉल के बाहर कुछ बदलने से अभी भी कैश समाप्त हो जाएगा।

इसके अतिरिक्त, पाचनकर्ता स्पष्ट और अंतर्निहित निर्भरता के लिए स्वचालित रूप से आपकी टेम्प्लेट फ़ाइल के माध्यम से देखेंगे, और इसमें पाचन के हिस्से के रूप में शामिल होंगे।

डाइजेस्टर को स्किप_डिगस्ट पास करके बाईपास किया जा सकता है: कैश कॉल के विकल्प के रूप में सही है:

<% cache project, skip_digest: true do %>
  <b>All the topics on this project</b>
  <%= render project.topics %>
<% end %>

निहित निर्भरता

अधिकांश टेम्प्लेट निर्भरताएं कॉल से ही टेम्पलेट में रेंडर करने के लिए प्राप्त की जा सकती हैं। यहाँ रेंडर कॉल के कुछ उदाहरण दिए गए हैं जो कैशे डाइजेस्ट को पता है कि कैसे डीकोड करना है:

render partial: "comments/comment", collection: commentable.comments
render "comments/comments"
render 'comments/comments'
render('comments/comments')

render "header" translates to render("comments/header")

render(@topic)         translates to render("topics/topic")
render(topics)         translates to render("topics/topic")
render(message.topics) translates to render("topics/topic")

हालांकि सभी रेंडर कॉल को प्राप्त करना संभव नहीं है, हालांकि। यहाँ कुछ चीजें हैं जो व्युत्पन्न नहीं की जा सकती हैं:

render group_of_attachments
render @project.documents.where(published: true).order('created_at')

आपको उन्हें स्पष्ट रूप में लिखना होगा:

render partial: 'attachments/attachment', collection: group_of_attachments
render partial: 'documents/document', collection: @project.documents.where(published: true).order('created_at')

स्पष्ट निर्भरताएँ

कभी-कभी आपके पास टेम्प्लेट की निर्भरताएँ होती हैं, जिन्हें बिल्कुल भी प्राप्त नहीं किया जा सकता है। यह आमतौर पर मामला होता है जब आपके पास टेम्पलेट रेंडरिंग होता है जो हेल्पर्स में होता है। यहाँ एक उदाहरण है:

<%= render_sortable_todolists @project.todolists %>

आपको कॉल करने के लिए एक विशेष टिप्पणी प्रारूप का उपयोग करना होगा:

<%# Template Dependency: todolists/todolist %>
<%= render_sortable_todolists @project.todolists %>

कुछ मामलों में, एकल तालिका वंशानुक्रम सेटअप की तरह, आपके पास स्पष्ट निर्भरता का एक समूह हो सकता है। हर टेम्पलेट को लिखने के बजाय, आप किसी निर्देशिका में किसी भी टेम्पलेट से मेल खाने के लिए वाइल्डकार्ड का उपयोग कर सकते हैं:

<%# Template Dependency: events/* %>
<%= render_categorizable_events @person.events %>

यह निर्भरता के रूप में निर्देशिका में हर टेम्पलेट को चिह्नित करता है। उन टेम्पलेटों को खोजने के लिए, वाइल्डकार्ड पथ को app/views या पथ से बिल्कुल परिभाषित किया जाना चाहिए अन्यथा prepend_view_path या append_view_path साथ जोड़ा append_view_path । इस तरह app/views/recordings/events लिए वाइल्डकार्ड recordings/events/*

स्पष्ट निर्भरता से मेल खाने के लिए उपयोग किया जाने वाला पैटर्न /# Template Dependency: (\S+)/ , इसलिए यह महत्वपूर्ण है कि आप इसे टाइप करें। आप प्रति पंक्ति केवल एक टेम्पलेट निर्भरता की घोषणा कर सकते हैं।

बाहरी निर्भरता

यदि आप एक सहायक विधि का उपयोग करते हैं, उदाहरण के लिए, कैश्ड ब्लॉक के अंदर और आप उस सहायक को अपडेट करते हैं, तो आपको कैश को भी टक्कर देना होगा। यह वास्तव में कोई फर्क नहीं पड़ता कि आप इसे कैसे करते हैं, लेकिन टेम्पलेट फ़ाइल के एमडी 5 को बदलना होगा। एक सिफारिश केवल एक टिप्पणी में स्पष्ट होने की है, जैसे:

<%# Helper Dependency Updated: May 6, 2012 at 6pm %>
<%= some_helper_method(person) %>

अब आपको बस इतना करना है कि हेल्पर मेथड को बदलने पर उस टाइमस्टैम्प को बदल दें।

संग्रह कैशिंग

जब वस्तुओं का एक संग्रह प्रदान करता है जो प्रत्येक एक ही आंशिक का उपयोग करता है, तो :cached विकल्प पारित किया जा सकता है।

संग्रह के लिए इस तरह प्रस्तुत:

<%= render partial: 'projects/project', collection: @projects, cached: true %>

cached: true एक्शन व्यू के रेंडरिंग को एक टेम्प्लेट प्रति एक कॉल के बजाय एक बार कैश से कई टेम्प्लेट पढ़ेगी।

पहले से कैश नहीं किए गए संग्रह में टेम्पलेट कैश के लिए लिखे गए हैं।

व्यक्तिगत टेम्पलेट टुकड़ा कैशिंग के साथ महान काम करता है। उदाहरण के लिए यदि संग्रह रेंडर करने वाले टेम्पलेट को कैश किया गया है:

# projects/_project.html.erb
<% cache project do %>
  <%# ... %>
<% end %>

किसी भी संग्रह रेंडरर्स को उन कैश्ड टेम्प्लेट मिलेंगे जब एक ही बार में कई टेम्प्लेट पढ़ने का प्रयास किया जाएगा।

यदि आपका संग्रह कैश कई स्रोतों पर निर्भर करता है (चीजों को सरल रखने के लिए इससे बचने की कोशिश करें), तो आप इन सभी निर्भरताओं को एक ब्लॉक के हिस्से के रूप में नाम दे सकते हैं जो एक सरणी देता है:

<%= render partial: 'projects/project', collection: @projects, cached: -> project { [ project, current_user ] } %>

इसमें कैश रिकॉर्ड के हिस्से के रूप में दोनों रिकॉर्ड शामिल होंगे और उनमें से किसी एक को अपडेट करने से कैश समाप्त हो जाएगा।

cache_fragment_name (नाम = {}, Skip_digest: nil, virtual_path: nil) स्रोत दिखाएं
# File actionview/lib/action_view/helpers/cache_helper.rb, line 211
def cache_fragment_name(name = {}, skip_digest: nil, virtual_path: nil)
  if skip_digest
    name
  else
    fragment_name_with_digest(name, virtual_path)
  end
end

यह सहायक किसी दिए गए टुकड़े कैश कॉल के लिए कैश कुंजी का नाम देता है। skip_digest: की आपूर्ति skip_digest: कैश के लिए सही है, कैश टुकड़े के पाचन को मैन्युअल रूप से बायपास किया जा सकता है। यह तब उपयोगी है जब कैश टुकड़े तब तक मैन्युअल रूप से समाप्त नहीं किए जा सकते हैं जब तक कि आपको सटीक कुंजी का पता न हो जो मेमेकैच्ड का उपयोग करते समय होता है।

virtual_path: का उपयोग करके पाचन उत्पन्न होगा virtual_path: यदि यह प्रदान किया गया है।

cache_if (स्थिति, नाम = {}, विकल्प = {}) {|| ...} स्रोत दिखाएं
# File actionview/lib/action_view/helpers/cache_helper.rb, line 183
def cache_if(condition, name = {}, options = {}, &block)
  if condition
    cache(name, options, &block)
  else
    yield
  end

  nil
end

यदि condition सत्य है, तो किसी दृश्य के कैश टुकड़े

<% cache_if admin?, project do %>
  <b>All the topics on this project</b>
  <%= render project.topics %>
<% end %>
cache_unless (स्थिति, नाम = {}, विकल्प = {}, और ब्लॉक) स्रोत दिखाएं
# File actionview/lib/action_view/helpers/cache_helper.rb, line 199
def cache_unless(condition, name = {}, options = {}, &block)
  cache_if !condition, name, options, &block
end

जब तक condition सही न हो, किसी दृश्य के कैश टुकड़े

<% cache_unless admin?, project do %>
  <b>All the topics on this project</b>
  <%= render project.topics %>
<% end %>