2012-02-07 13 views
9

में Haml के साथ 3.0 (3.1.4) रेल मैंcontent_for partials में उपज बनाम

  1. कुछ टेम्पलेट की तरह आंशिक, है _template.html.haml की तरह:

    .panel.top 
        = yield :panel_top 
    
    .content 
        = yield 
    
  2. कुछ अन्य आंशिक जो पिछली टेम्पलेट का उपयोग करके प्रदर्शित किया जाएगा (यह सब सामान AJAX का उपयोग करके प्रस्तुत किया जाता है, लेकिन इससे कोई फर्क नहीं पड़ता)

    - content_for :panel_top do 
    .title.left 
        = title 
    
    content text 
    

और इस 3.2 यह विफल करने के लिए रेल 3,0

में एक आकर्षण की तरह काम किया लेकिन, अपग्रेड करने के बाद! Yiels सिर्फ पैदावार "सामग्री पाठ", तो मैं "सामग्री पाठ" दो बार और सभी

में कोई शीर्षक के लिए ही 3,2

= yield :panel_top= content_for :panel_top लिए काम करता है बदल रहा है मुझे यकीन है कि इस समाधान ठीक है, और अगर नहीं कर रहा हूँ है यह स्थिर या अनुशंसित है, मुझे yield प्रसंस्करण में परिवर्तनों के बारे में कोई भी नोट नहीं मिल रहा है और न ही रेल 3.1 रिलीज नोट्स में, न ही 3.2 में।

क्या आप आंशिक रूप से yield आईएनजी को व्यवस्थित करने का सबसे अच्छा तरीका क्या कर सकते हैं?

उत्तर

10

रेल 3.0 से 3.2 content_for रेल के लिए वास्तव में बदला गया था:

3,0:

def content_for(name, content = nil, &block) 
    content = capture(&block) if block_given? 
    @_content_for[name] << content if content 
    @_content_for[name] unless content 
end 

3,2:

def content_for(name, content = nil, &block) 
    if content || block_given? 
    content = capture(&block) if block_given? 
    @view_flow.append(name, content) if content 
    nil 
    else 
    @view_flow.get(name) 
    end 
end 

यह हमें पता चलता है, कि 3.2 content_for कार्यों से सामग्री को दिखाने/डालने के लिए, न केवल इसे स्टोर करें या नाम खंड।

इसके अलावा, यदि आप yield तर्क को डीबग करने का प्रयास करते हैं तो आप यह सुनिश्चित करेंगे कि content_for से पहले यह उपज सही ढंग से शुरू हो गया है।

तो, यह चर्चा से बाहर टुकड़ा कैशिंग छोड़ने मैं निष्कर्ष निकाल सकते हैं कि content_forpreferrable शीर्ष स्तर के लेआउट को छोड़कर कहीं भी नामित वर्गों सम्मिलित करने के लिए तरीका है। मददगार और अन्य स्थितियों में yield गलत परिणाम प्रस्तुत करना चाहिए।