2012-05-25 11 views
6

मैं yield और content_for के साथ एक गतिशील सामग्री बनाने की कोशिश कर रहा हूं। असल में मेरे पास लेआउट का गुच्छा है। और मैं प्रत्येक लेआउट के लिए विचारों का गुच्छा बनाना नहीं चाहता हूं। जब जरूरत पड़ती है तो मैं दृश्य भागों को प्रस्तुत करना चाहता हूं। कोड के विभिन्न हिस्सों के लिए यह ठीक है। लेकिन मुझे अलग-अलग सामग्री के साथ एक ही भागों में समस्या है।रेल 3 में उपज करने के लिए पैरामीटर पास करना (या यह संभव है?)

मेरी application.html.erb

<%= yield %> 
<%= yield :name_section %> 

में और मेरे show.html.erb में मेरे पास है;

<% content_for :name_section do %> 
    <b>Name:</b> 
    <%= @post.name %> 
<% end %> 

यहाँ सवाल यह है;

यदि मैं विभिन्न सामग्रियों के साथ एकाधिक नाम_सेक्शन करना चाहता हूं तो क्या होगा। मेरा मतलब; मैं :name_section अलग-अलग सामग्री के साथ अपने दृश्य में विभिन्न स्थानों को रखना चाहता हूं।

पूर्व के लिए;

<table> 
    <tr> 
    <td> 
     <%= yield :name_section %> 
    </td> 
    </tr> 
    <tr> 
    <td> 
     <%= yield :name_section %> 
    </td> 
    </tr> 
</table> 

कोई विचार?

धन्यवाद। Çağdaş

+0

उन्हें एक ही नाम की आवश्यकता क्यों है? निश्चित रूप से रूबी जादू करता है लेकिन यह दिमाग पढ़ता है। विभिन्न नामों के साथ – drhenner

+0

मुझे अपने कोड को डुप्लिकेट करना होगा। लेकिन मुझे लगता है कि मैं मददगार के साथ इस समस्या को हल करता हूं। वैसे भी प्रतिक्रिया के लिए धन्यवाद। –

+0

डुप्लिकेट कोड न भूलें और एक ही जिम्मेदारी दोनों महत्वपूर्ण हैं – drhenner

उत्तर

2

प्रलेखन को देखते हुए:

http://api.rubyonrails.org/classes/ActionView/Helpers/RenderingHelper.html#method-i-_layout_for

और विधि के स्रोत कोड (आप इसे वहाँ ब्राउज़ कर सकते हैं):

def _layout_for(*args, &block) 
    name = args.first 

    if block && !name.is_a?(Symbol) 
    capture(*args, &block) 
    else 
    super 
    end 
end 

क्या आप के लिए पूछ रहे हैं साथ संभव नहीं है लेआउट में yield

2

निम्नलिखित समाधान ने मेरे लिए अच्छी तरह से काम किया है। यह आपको आर्ग पारित करने के लिए अनुमति नहीं है, लेकिन अगर, सही content_for (दूसरी बार) कॉल करने से पहले, आप उदाहरण चर के लिए अपने आर्ग असाइन करते हैं, यह आप content_for में अपने उदाहरण चर संदर्भित करने के लिए अनुमति देता है। मूल विचार है कि content_for जब यह 1 समय कहा जाता है और उस सामग्री को तो स्थिर बनी हुई है सामग्री उत्पन्न करता है, लेकिन इस समाधान है कि स्थिर सामग्री पीढ़ी विलंब जब तक आप सामग्री प्रदर्शित करने के लिए तैयार हैं।

पहले, अपने सहायक मॉड्यूल को यह समारोह जोड़ें:

def immediate_content_for name, content = nil, &block 
    @immediate_content ||= {} 
    if content || block_given? then 
    @immediate_content[name] = Proc.new { content_for name, content, &block } 
    nil 
    else 
    @immediate_content[name].call 
    content_for name 
    end 
end 

उसके बाद, आप content_for को arg1 पारित करने के लिए चाहते हैं। अब आप यह कर सकते हैं: तो फिर बाद में अपने कोड में,

<% content_for :my_form %> 
    <%= some_helper_function(@arg1) %> 
<% end %> 

, के बाद अपने परिभाषित arg1:

<%= @arg1 = arg1 %> 
<%= content_for :my_form %> 

यह अर्थ में एक हैक है कि मैं गारंटी नहीं दे सकते कि immediate_content_for के व्यवहार है अन्य सभी तरह content_for के समान में है, और अगर रेल से कुछ भविष्य संस्करण में content_for परिवर्तन के व्यवहार, आप immediate_content_for अद्यतन करने के लिए यदि आप इसे content_for मिरर जारी रखना चाहते हैं की आवश्यकता होगी। हालांकि यह एक इष्टतम समाधान नहीं है, यह अब के लिए नौकरी करता है।

6

मुझे विश्वास है कि क्या आप के लिए पूछ रहे थे अब संभव है:

# The template 
<%= render layout: "my_layout" do |customer| %> 
    Hello <%= customer.name %> 
<% end %> 

# The layout 
<html> 
    <%= yield Struct.new(:name).new("David") %> 
</html> 

से: http://api.rubyonrails.org/classes/ActionView/Helpers/RenderingHelper.html#method-i-_layout_for

उम्मीद है कि इस किसी और ही समाधान की तलाश में मदद करता है।

+0

महान, इसके लिए धन्यवाद! :) –

संबंधित मुद्दे