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

मॉड्यूल एक्शन व्यू :: हेल्पर्स :: कैप्चर हेल्पर




ruby

मॉड्यूल एक्शन व्यू :: हेल्पर्स :: कैप्चर हेल्पर

CaptureHelper आपको उत्पन्न मार्कअप को निकालने के लिए तरीकों को उजागर करता है जिसका उपयोग टेम्पलेट या लेआउट फ़ाइल के अन्य भागों में किया जा सकता है।

यह कैप्चर के माध्यम से वेरिएबल्स में ब्लॉक कैप्चर करने का तरीका प्रदान करता है और content_for माध्यम से लेआउट में उपयोग के लिए मार्कअप के ब्लॉक को कैप्चर करने का तरीका है।

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

कैप्चर (* args) {| * args | ...} स्रोत दिखाएं
# File actionview/lib/action_view/helpers/capture_helper.rb, line 39
def capture(*args)
  value = nil
  buffer = with_output_buffer { value = yield(*args) }
  if (string = buffer.presence || value) && string.is_a?(String)
    ERB::Util.html_escape string
  end
end

कैप्चर विधि String ऑब्जेक्ट के रूप में टेम्पलेट का हिस्सा निकालती है। फिर आप अपने टेम्प्लेट, लेआउट या हेल्पर्स में कहीं भी इस ऑब्जेक्ट का उपयोग कर सकते हैं।

कैप्चर विधि का उपयोग ईआरबी टेम्प्लेट में किया जा सकता है ...

<% @greeting = capture do %>
  Welcome to my shiny new web page!  The date and time is
  <%= Time.now %>
<% end %>

... और बिल्डर (RXML) टेम्प्लेट।

@timestamp = capture do
  "The current timestamp is #{Time.now}."
end

फिर आप उस चर का उपयोग कहीं और कर सकते हैं। उदाहरण के लिए:

<html>
<head><title><%= @greeting %></title></head>
<body>
<b><%= @greeting %></b>
</body>
</html>
content_for (नाम, सामग्री = शून्य, विकल्प = {}, और ब्लॉक) स्रोत दिखाएं
# File actionview/lib/action_view/helpers/capture_helper.rb, line 151
def content_for(name, content = nil, options = {}, &block)
  if content || block_given?
    if block_given?
      options = content if content
      content = capture(&block)
    end
    if content
      options[:flush] ? @view_flow.set(name, content) : @view_flow.append(name, content)
    end
    nil
  else
    @view_flow.get(name).presence
  end
end

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

नोट: yield अभी भी संग्रहीत सामग्री को पुनः प्राप्त करने के लिए इस्तेमाल किया जा सकता है, लेकिन कॉलिंग yield सहायक मॉड्यूल में काम नहीं करता है, जबकि content_for करता है।

<% content_for :not_authorized do %>
  alert('You are not authorized to do that!')
<% end %>

फिर आप अपने टेम्प्लेट में कहीं भी content_for :not_authorized उपयोग कर सकते हैं।

<%= content_for :not_authorized if current_user.nil? %>

यह इसके बराबर है:

<%= yield :not_authorized if current_user.nil? %>

content_for , हालांकि, सहायक मॉड्यूल में भी इस्तेमाल किया जा सकता है।

module StorageHelper
  def stored_content
    content_for(:storage) || "Your storage is empty"
  end
end

यह सहायक सामान्य सहायकों की तरह ही काम करता है।

<%= stored_content %>

आप किसी लेआउट में yield लिए मौजूदा कॉल के साथ yield सिंटैक्स का भी उपयोग कर सकते हैं। उदाहरण के लिए:

<%# This is the layout %>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>My Website</title>
  <%= yield :script %>
</head>
<body>
  <%= yield %>
</body>
</html>

और अब, हम एक ऐसा दृश्य बनाएंगे जिसमें एक content_for कॉल है जो script पहचानकर्ता बनाता है।

<%# This is our view %>
Please login!

<% content_for :script do %>
  <script>alert('You are not authorized to view this page!')</script>
<% end %>

फिर, दूसरे दृश्य में, आप कुछ इस तरह से कर सकते हैं:

<%= link_to 'Logout', action: 'logout', remote: true %>

<% content_for :script do %>
  <%= javascript_include_tag :defaults %>
<% end %>

वह पृष्ठ पर जावास्क्रिप्ट फ़ाइलों के आपके डिफ़ॉल्ट सेट के लिए script टैग रखेगा; यह तकनीक उपयोगी है यदि आप केवल कुछ दृश्यों में इन लिपियों का उपयोग कर रहे हैं।

ध्यान दें कि content_for concatenates (डिफ़ॉल्ट) ब्लॉक यह एक विशेष पहचानकर्ता के लिए दिया जाता है। उदाहरण के लिए:

 <% content_for :navigation do %>
   <li><%= link_to 'Home', action: 'index' %></li>
 <% end %>

And in another place:

 <% content_for :navigation do %>
   <li><%= link_to 'Login', action: 'login' %></li>
 <% end %>

फिर, किसी अन्य टेम्पलेट या लेआउट में, यह कोड क्रम में दोनों लिंक प्रस्तुत करेगा:

<ul><%= content_for :navigation %></ul>

यदि फ्लश पैरामीटर true content_for है तो इसे दिए गए ब्लॉकों को बदल देता है। उदाहरण के लिए:

<% content_for :navigation do %>
  <li><%= link_to 'Home', action: 'index' %></li>
<% end %>

<%#  Add some other content, or use a different template: %>

<% content_for :navigation, flush: true do %>
  <li><%= link_to 'Login', action: 'login' %></li>
<% end %>

फिर, किसी अन्य टेम्पलेट या लेआउट में, यह कोड केवल अंतिम लिंक प्रस्तुत करेगा:

<ul><%= content_for :navigation %></ul>

अंत में, साधारण सामग्री को एक पैरामीटर के रूप में पारित किया जा सकता है:

<% content_for :script, javascript_include_tag(:defaults) %>

चेतावनी: content_for को कैश में अनदेखा किया गया है। इसलिए आपको इसका उपयोग उन तत्वों के लिए नहीं करना चाहिए जो खंडित कैश होंगे।

content_for? (नाम) स्रोत दिखाएँ
# File actionview/lib/action_view/helpers/capture_helper.rb, line 191
def content_for?(name)
  @view_flow.get(name).present?
end

content_for? यह देखता है कि क्या किसी भी सामग्री पर अभी तक content_for का उपयोग करके कब्जा किया गया है आपके लेआउट के कुछ हिस्सों को अलग-अलग तरीके से प्रस्तुत करने के लिए उपयोगी है जो आपके विचारों में है।

<%# This is the layout %>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>My Website</title>
  <%= yield :script %>
</head>
<body class="<%= content_for?(:right_col) ? 'two-column' : 'one-column' %>">
  <%= yield %>
  <%= yield :right_col %>
</body>
</html>
प्रदान (नाम, सामग्री = शून्य, और ब्लॉक) दिखाएँ स्रोत
# File actionview/lib/action_view/helpers/capture_helper.rb, line 171
def provide(name, content = nil, &block)
  content = capture(&block) if block_given?
  result = @view_flow.append!(name, content) if content
  result unless content
end

content_for समान लेकिन जब स्ट्रीमिंग फ्लश के साथ सीधे लेआउट में वापस आती है। दूसरे शब्दों में, यदि आप दिए गए टेम्प्लेट को रेंडर करते समय एक ही बफर को कई बार बदलना चाहते हैं, तो आपको content_for उपयोग करना चाहिए, यदि नहीं, तो अधिक सामग्री की तलाश को रोकने के लिए लेआउट को बताने के लिए provide करें।