यदि पैदावार की जाँच करें: सामग्री content_for में परिभाषित किया गया है


97

मैं लेआउट स्तर पर एक सशर्त प्रतिपादन करना चाहता हूं जो वास्तविक टेम्पलेट के आधार पर परिभाषित किया गया है content_for(:an__area), किसी भी विचार को यह कैसे किया जाए?


रेल में इस व्यवहार को
रोकने के

जवाबों:


217

@content_for_whateverपदावनत किया गया है। उपयोगcontent_for?इसके बजाय , जैसे:

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% end %>

16
हेल्पर content_for?केवल रेल 3 में मौजूद है। रेल 2 में आप @content_for_...उदाहरण चर का उपयोग कर सकते हैं ।
ऐसा न हो कि

10

सहायक विधि बनाने के लिए वास्तव में आवश्यक नहीं:

<% if @content_for_sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>

तब आपके विचार में:

<% content_for :sidebar do %>
  ...
<% end %>

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



2

एक सहायक बना सकते हैं:

def content_defined?(var)
  content_var_name="@content_for_#{var}"    
  !instance_variable_get(content_var_name).nil?
end

और अपने लेआउट में इसका उपयोग करें:

<% if content_defined?(:an__area) %>
  <h1>An area is defined: <%= yield :an__area %></h1>
<% end %>

यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण मांगने या उसका अनुरोध करने के लिए, उनके पोस्ट के नीचे एक टिप्पणी छोड़ दें।
eirikir

मैं मानता हूं @eirikir, यकीन नहीं होता कि मेरा 6 साल का छोटा बच्चा क्या सोच रहा था। मैं उन लोगों के लिए अपना जवाब छोड़ रहा हूं, जो अभी भी रेल 2 पर हैं .. अनावश्यक प्रस्तावना के बिना;)
निक

1

ठीक है, मैं बेशर्मी से कर रहा हूं कि कोई भी जवाब नहीं दे रहा है और मैंने पहले ही जवाब पा लिया है :) इसे एक सहायक विधि के रूप में परिभाषित करें जैसे कि application_helper.rb में या कहीं भी आपको सुविधाजनक लगे।

  def content_defined?(symbol)
    content_var_name="@content_for_" + 
      if symbol.kind_of? Symbol 
        symbol.to_s
      elsif symbol.kind_of? String
        symbol
      else
        raise "Parameter symbol must be string or symbol"
      end

    !instance_variable_get(content_var_name).nil?

  end

हे, मुझे आपका स्व-उत्तर पसंद है लेकिन ... माइनर पॉइंट, instance_variable_defined?(content_var_name)परीक्षण के बजाय थोड़ा शून्य है कि क्या यह शून्य है। दूसरा बड़ा बिंदु, content_for उदाहरण चर को पदावनत किया जाता है, इसलिए आपका समाधान भविष्य का प्रमाण नहीं है
डेव नोलन

1

मुझे उपज के दो बार प्रदर्शन के निहितार्थ के बारे में यकीन नहीं है, लेकिन यह उपज के आंतरिक कार्यान्वयन की परवाह किए बिना (@content_for_xyz पदावनत है) और बिना किसी अतिरिक्त कोड या सहायक तरीकों के करेगा:

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.