Ruby on Rails 5.2 - ActionController::ConditionalGet

मॉड्यूल ActionController :: ConditionalGet




ruby

मॉड्यूल ActionController :: ConditionalGet

शामिल मॉड्यूल:
ActionController::Head

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

expires_in (सेकंड, विकल्प = {}) स्रोत दिखाएं
# File actionpack/lib/action_controller/metal/conditional_get.rb, line 234
def expires_in(seconds, options = {})
  response.cache_control.merge!(
    max_age: seconds,
    public: options.delete(:public),
    must_revalidate: options.delete(:must_revalidate)
  )
  options.delete(:private)

  response.cache_control[:extras] = options.map { |k, v| "#{k}=#{v}" }
  response.date = Time.now unless response.date?
end

HTTP 1.1 कैश-कंट्रोल हेडर सेट करता है। एक private निर्देश जारी करने में चूक, ताकि मध्यवर्ती कैश को प्रतिक्रिया को कैश न करना पड़े।

expires_in 20.minutes
expires_in 3.hours, public: true
expires_in 3.hours, public: true, must_revalidate: true

यह विधि मौजूदा कैश-कंट्रोल हेडर को अधिलेखित कर देगी। अधिक संभावनाओं के लिए www.w3.org/Protocols/rfc2616/rfc2616-sec14.html देखें।

विधि क्लाइंट संगतता के लिए एक HTTP Date हेडर भी सुनिश्चित करेगी।

# File actionpack/lib/action_controller/metal/conditional_get.rb, line 249
def expires_now
  response.cache_control.replace(no_cache: true)
end

बिना कैश के HTTP 1.1 कैश-कंट्रोल हेडर सेट करता है। इसका मतलब यह है कि संसाधन को बासी के रूप में चिह्नित किया जाएगा, इसलिए ग्राहकों को हमेशा अमान्य होना चाहिए। इंटरमीडिएट / ब्राउज़र कैश अभी भी संपत्ति को स्टोर कर सकते हैं।

fresh_when (ऑब्जेक्ट = nil, etag: nil, weak_etag: nil, strong_etag: nil, last_modified: nil, public: false, टेम्पलेट: nil) स्रोत दिखाएं
# File actionpack/lib/action_controller/metal/conditional_get.rb, line 105
def fresh_when(object = nil, etag: nil, weak_etag: nil, strong_etag: nil, last_modified: nil, public: false, template: nil)
  weak_etag ||= etag || object unless strong_etag
  last_modified ||= object.try(:updated_at) || object.try(:maximum, :updated_at)

  if strong_etag
    response.strong_etag = combine_etags strong_etag,
      last_modified: last_modified, public: public, template: template
  elsif weak_etag || template
    response.weak_etag = combine_etags weak_etag,
      last_modified: last_modified, public: public, template: template
  end

  response.last_modified = last_modified if last_modified
  response.cache_control[:public] = true if public

  head :not_modified if request.fresh?(response)
end

last_modified सेट करता है, last_modified , या दोनों प्रतिक्रिया पर और अनुरोध को पहले से ही ताज़ा होने पर 304 Not Modified प्रतिक्रिया प्रदान करता है।

पैरामीटर:

  • :etag etag एक "कमजोर" ETag सत्यापनकर्ता को प्रतिक्रिया पर सेट करता है। देखें :weak_etag विकल्प।

  • :weak_etag प्रतिक्रिया पर "कमजोर" ETag सत्यापनकर्ता सेट करता है। यदि कोई-नहीं-मैच हैडर सेट करता है, तो यह ETag से मिलान होने पर 304 Not Modified प्रतिक्रिया दे सकता है। एक कमजोर ETag शब्दार्थ समतुल्यता को इंगित करता है, न कि बाइट-बाइट समानता के लिए, इसलिए वे ब्राउज़र कैश में HTML पृष्ठों को कैशिंग करने के लिए अच्छे हैं। उनका उपयोग उन प्रतिक्रियाओं के लिए नहीं किया जा सकता है जो बाइट-समान होनी चाहिए, जैसे पीडीएफ फाइल के भीतर Range अनुरोधों की सेवा।

  • :strong_etag प्रतिक्रिया पर "मजबूत" ETag सत्यापनकर्ता सेट करता है। यदि कोई-नहीं-मैच हैडर सेट करता है, तो यह ETag से मिलान होने पर 304 Not Modified प्रतिक्रिया दे सकता है। एक मजबूत ETag सटीक समानता का अर्थ है: प्रतिक्रिया को बाइट के लिए बाइट से मेल खाना चाहिए। यह एक बड़े वीडियो या पीडीएफ फाइल के भीतर Range अनुरोध करने के लिए आवश्यक है, उदाहरण के लिए, या कुछ सीडीएन के साथ संगतता के लिए जो कमजोर ETags का समर्थन नहीं करते हैं।

  • :last_modified प्रतिक्रिया पर "कमजोर" अंतिम-अद्यतन सत्यापनकर्ता सेट करता है। यदि बाद में संशोधित किए गए अनुरोधों को अंतिम-संशोधित किया गया हो तो 304 संशोधित नहीं हो सकता है।

  • :public रूप से कैश-कंट्रोल हैडर डिफ़ॉल्ट रूप से निजी है, इसे true सेट करें यदि आप चाहते हैं कि आपका एप्लिकेशन अन्य उपकरणों (प्रॉक्सी कैश) द्वारा कैचवेबल हो।

  • :template डिफ़ॉल्ट रूप से, वर्तमान नियंत्रक / कार्रवाई के लिए टेम्पलेट ईटीएजी में शामिल है। यदि कार्रवाई एक अलग टेम्पलेट प्रदान करती है, तो आप इसके बजाय इसके पाचन को शामिल कर सकते हैं। यदि कार्रवाई किसी टेम्पलेट को प्रस्तुत नहीं करती है, तो आप template: false को पास कर सकते हैं template: false टेम्पलेट डाइजेस्ट के लिए जांच करने के किसी भी प्रयास को छोड़ने के लिए template: false

उदाहरण:

def show
  @article = Article.find(params[:id])
  fresh_when(etag: @article, last_modified: @article.updated_at, public: true)
end

यदि अनुरोध मेल खाने वाला ईटाग या इफ-मोडिफाइड-हेडर 304 Not Modified दे रहा है और एक मैच होने पर 304 Not Modified रिस्पांस नहीं दे रहा है तो यह शो टेम्पलेट को रेंडर करेगा।

आप सिर्फ एक रिकॉर्ड भी पास कर सकते हैं। इस मामले में last_modified को खुद ही पास करके updated_at और updated_at को कॉल करके सेट किया जाएगा।

def show
  @article = Article.find(params[:id])
  fresh_when(@article)
end

आप एक ऑब्जेक्ट भी पारित कर सकते हैं जो maximum प्रतिक्रिया करता है, जैसे कि सक्रिय रिकॉर्ड का संग्रह। इस मामले में last_modified को संग्रह में maximum(:updated_at) और सबसे हाल ही में अपडेट किए गए रिकॉर्ड का टाइमस्टैम्प) और ऑब्जेक्ट पास करके maximum(:updated_at) सेट किया जाएगा।

def index
  @articles = Article.all
  fresh_when(@articles)
end

रिकॉर्ड या संग्रह पास करते समय, आप अभी भी सार्वजनिक शीर्ष लेख सेट कर सकते हैं:

def show
  @article = Article.find(params[:id])
  fresh_when(@article, public: true)
end

डिफ़ॉल्ट कंट्रोलर / एक्शन स्टाइल से अलग टेम्प्लेट प्रस्तुत करते समय, आप यह संकेत कर सकते हैं कि ETag में कौन से डाइजेस्ट शामिल हैं:

before_action { fresh_when @article, template: 'widgets/show' }
http_cache_forever (सार्वजनिक: गलत) {|| ...} स्रोत दिखाएं
# File actionpack/lib/action_controller/metal/conditional_get.rb, line 261
def http_cache_forever(public: false)
  expires_in 100.years, public: public

  yield if stale?(etag: request.fullpath,
                  last_modified: Time.new(2011, 1, 1).utc,
                  public: public)
end

कैश या ब्लॉक उपज। माना जाता है कि कैश कभी समाप्त नहीं होगा।

आप इस विधि का उपयोग तब कर सकते हैं जब आपके पास HTTP प्रतिक्रिया होती है जो कभी नहीं बदलती है, और ब्राउज़र और प्रॉक्सी को इसे अनिश्चित काल तक कैश करना चाहिए।

  • public : डिफ़ॉल्ट रूप से, HTTP प्रतिक्रियाएं निजी हैं, केवल उपयोगकर्ता के वेब ब्राउज़र पर कैश की गई हैं। प्रॉक्सी को प्रतिक्रिया को कैश करने की अनुमति देने के लिए, यह इंगित करना true है कि वे सभी उपयोगकर्ताओं को कैश्ड प्रतिक्रिया दे सकते हैं।

बासी? (ऑब्जेक्ट = नील, ** ताजगी_कवार) स्रोत दिखाएँ
# File actionpack/lib/action_controller/metal/conditional_get.rb, line 218
def stale?(object = nil, **freshness_kwargs)
  fresh_when(object, **freshness_kwargs)
  !request.fresh?(response)
end

प्रतिक्रिया पर last_modified और / या last_modified सेट करता है और क्लाइंट अनुरोध के खिलाफ इसकी जांच करता है। यदि अनुरोध प्रदान किए गए विकल्पों से मेल नहीं खाता है, तो अनुरोध को बासी माना जाता है और इसे खरोंच से उत्पन्न किया जाना चाहिए। अन्यथा, यह ताजा है और हमें कुछ भी उत्पन्न करने की आवश्यकता नहीं है और 304 Not Modified का जवाब भेजा जाता है।

पैरामीटर:

  • :etag etag एक "कमजोर" ETag सत्यापनकर्ता को प्रतिक्रिया पर सेट करता है। देखें :weak_etag विकल्प।

  • :weak_etag प्रतिक्रिया पर "कमजोर" ETag सत्यापनकर्ता सेट करता है। यदि कोई-नहीं-मैच हैडर सेट करता है, तो यह ETag से मिलान होने पर 304 Not Modified प्रतिक्रिया दे सकता है। एक कमजोर ETag शब्दार्थ समतुल्यता को इंगित करता है, न कि बाइट-बाइट समानता के लिए, इसलिए वे ब्राउज़र कैश में HTML पृष्ठों को कैशिंग करने के लिए अच्छे हैं। उनका उपयोग उन प्रतिक्रियाओं के लिए नहीं किया जा सकता है जो बाइट-समान होनी चाहिए, जैसे पीडीएफ फाइल के भीतर Range अनुरोधों की सेवा।

  • :strong_etag प्रतिक्रिया पर "मजबूत" ETag सत्यापनकर्ता सेट करता है। यदि कोई-नहीं-मैच हैडर सेट करता है, तो यह ETag से मिलान होने पर 304 Not Modified प्रतिक्रिया दे सकता है। एक मजबूत ETag सटीक समानता का अर्थ है: प्रतिक्रिया को बाइट के लिए बाइट से मेल खाना चाहिए। यह एक बड़े वीडियो या पीडीएफ फाइल के भीतर Range अनुरोध करने के लिए आवश्यक है, उदाहरण के लिए, या कुछ सीडीएन के साथ संगतता के लिए जो कमजोर ETags का समर्थन नहीं करते हैं।

  • :last_modified प्रतिक्रिया पर "कमजोर" अंतिम-अद्यतन सत्यापनकर्ता सेट करता है। यदि बाद में संशोधित किए गए अनुरोधों को अंतिम-संशोधित किया गया हो तो 304 संशोधित नहीं हो सकता है।

  • :public रूप से कैश-कंट्रोल हैडर डिफ़ॉल्ट रूप से निजी है, इसे true सेट करें यदि आप चाहते हैं कि आपका एप्लिकेशन अन्य उपकरणों (प्रॉक्सी कैश) द्वारा कैचवेबल हो।

  • :template डिफ़ॉल्ट रूप से, वर्तमान नियंत्रक / कार्रवाई के लिए टेम्पलेट ईटीएजी में शामिल है। यदि कार्रवाई एक अलग टेम्पलेट प्रदान करती है, तो आप इसके बजाय इसके पाचन को शामिल कर सकते हैं। यदि कार्रवाई किसी टेम्पलेट को प्रस्तुत नहीं करती है, तो आप template: false को पास कर सकते हैं template: false टेम्पलेट डाइजेस्ट के लिए जांच करने के किसी भी प्रयास को छोड़ने के लिए template: false

उदाहरण:

def show
  @article = Article.find(params[:id])

  if stale?(etag: @article, last_modified: @article.updated_at)
    @statistics = @article.really_expensive_call
    respond_to do |format|
      # all the supported formats
    end
  end
end

आप सिर्फ एक रिकॉर्ड भी पास कर सकते हैं। इस मामले में last_modified को खुद ही पास करके updated_at और updated_at को कॉल करके सेट किया जाएगा।

def show
  @article = Article.find(params[:id])

  if stale?(@article)
    @statistics = @article.really_expensive_call
    respond_to do |format|
      # all the supported formats
    end
  end
end

आप एक ऑब्जेक्ट भी पारित कर सकते हैं जो maximum प्रतिक्रिया करता है, जैसे कि सक्रिय रिकॉर्ड का संग्रह। इस मामले में last_modified को कॉल करके + संग्रह (अधिकतम अपडेट किया गया) + संग्रह (सबसे हाल ही में अपडेट किए गए रिकॉर्ड का टाइमस्टैम्प) और ऑब्जेक्ट पास करके etag द्वारा सेट किया जाएगा।

def index
  @articles = Article.all

  if stale?(@articles)
    @statistics = @articles.really_expensive_call
    respond_to do |format|
      # all the supported formats
    end
  end
end

रिकॉर्ड या संग्रह पास करते समय, आप अभी भी सार्वजनिक शीर्ष लेख सेट कर सकते हैं:

def show
  @article = Article.find(params[:id])

  if stale?(@article, public: true)
    @statistics = @article.really_expensive_call
    respond_to do |format|
      # all the supported formats
    end
  end
end

डिफ़ॉल्ट कंट्रोलर / एक्शन स्टाइल से अलग टेम्प्लेट प्रस्तुत करते समय, आप यह संकेत कर सकते हैं कि ETag में कौन से डाइजेस्ट शामिल हैं:

def show
  super if stale? @article, template: 'widgets/show'
end