2010-05-25 7 views
7

मैं एक साधारण उपज उपयोग के मामले है और कुछ अज्ञात कारण के लिए डिफ़ॉल्ट मामला कभी नहीं दिखाया जाता है:यील्ड और डिफ़ॉल्ट मामला || नहीं उत्पादन डिफ़ॉल्ट मामले

मेरी super_admin लेआउट में मेरे पास है:

<%= yield :body_id || 'super_admin_main' %> 

मेरे नियंत्रक

class Superadmin::GolfsController < ApplicationController 
    layout "super_admin" 

    def show 

    end 
end 

मेरे शो को देखने

के साथ या बिना

<% content_for(:body_id) do %>sadmin_golfs<% end %> 

के साथ: sadmin_golfs दिखाया गया है।

बिना: रिक्त स्ट्रिंग super_admin_main के बजाय दिखाया गया है

किसी को भी एक ही व्यवहार को पुनः कर सकते हैं?

उत्तर

17

उपयोग कोष्ठकों:

<%= (yield :body_id) || 'super_admin_main' %> 

या

<%= yield(:body_id) || 'super_admin_main' %> 

उनके बिना यह मानते हुए है yield (:body_id || 'super_admin_main')

संपादित करें: रेल 3 ActiveSupport::SafeBuffer बजाय स्ट्रिंग/नहीं के बराबर का उपयोग करता है (रेल 2), तो अगर content_for प्रदान नहीं किया गया है तो आउटपुट शून्य नहीं है। तो कोशिश:

<%= yield(:body_id).empty? ? 'super_admin_main' : yield(:body_id)%> 
+0

असल में यह तब भी एक खाली स्ट्रिंग दिखाता है जब कोई content_for आपूर्ति नहीं की जाती है। – coulix

+0

आप बिल्कुल 'content_for' suppy नहीं करते हैं या यह '<% content_for (: body_id)%><% end %>' की तरह खाली है? – Voyta

+0

संपादित उत्तर देखें – Voyta

1

रेल में 3

अपरिभाषित विधि `वर्तमान 'को जन्म देती है

+0

मुझे लगता है कि आपका मतलब है" .present? " –

+0

अब तक का सबसे सुंदर समाधान मैंने पाया है (रत्न के बिना)। धन्यवाद। – Abdulaziz

3

कोई परीक्षण एक content_for देखते हैं या देखने संकलन में परिभाषित नहीं करता है, तो क्यों।

content_for कोड में हम देख सकते हैं:

def content_for(name, content = nil, &block) 
    ivar = "@content_for_#{name}" 
    content = capture(&block) if block_given? 
    instance_variable_set(ivar, "#{instance_variable_get(ivar)}#{content}".html_safe) 
    nil 
end 

तो आपके मामले में, @content_for_body_id अगर एक content_for आपके विचार में परिभाषित है।

आप कर सकते हैं बनाया:

<%= instance_variable_defined?('@content_for_body_id') ? yield(:body_id) : 'super_admin_main' %> 

आप prefere आप के बाद

def yield_or(part, result) 
    instance_variable_defined?("@content_for_#{part}") ? instance_variable_get("@content_for_#{part}") : result 
end 

एक सहायक पैदा करते हैं और द्वारा

<%= yield_or(:body_id, 'super_admin_main') %> 

यह आपके ध्यान में रखते हुए यह कॉल कर सकते हैं, तो रेल के साथ ही काम करता है 2.3।एक्स

रेल 3 में:

इस विधि content_for?

23

प्रयास करें <%= yield(:title).presence || 'My Default Title' %>

Object#presenceobject.present? ? object : nil (के रूप में 3 rc दस्तावेज़) के बराबर है देखते हैं, और अनिवार्य रूप से पारंपरिक वाक्य रचना की अनुमति देता है खिताब।

+2

यह रेल 3 के लिए बेहतर जवाब है – cyrilchampier

1

मुझे पता है कि यह एक पुराना सवाल है लेकिन मेरे पास रेल 2.3 का समाधान है।

मैं shingara's yield_or सहायक विधि ऊपर बढ़ाया है इसलिए अब यह एक ब्लॉक को स्वीकार कर सकते हैं:

module ApplicationHelper 
    def yield_or(name, content = nil, &block) 
    ivar = "@content_for_#{name}" 

    if instance_variable_defined?(ivar) 
     content = instance_variable_get(ivar) 
    else 
     content = block_given? ? capture(&block) : content 
    end 

    block_given? ? concat(content) : content 
    end 
end 

और यह आपकी टेम्पलेट्स में इस्तेमाल किया जा सकता है:

<% yield_or :something do %> 
    <p>something else</p> 
<% end %> 

या

<%= yield_or :something, 'something else' %> 
0
<div class= <%= (yield :content_with_bunners).present? ? yield(:content_with_bunners) : "col-md-10"%>> 
0

आप उपयोग कर सकते हैं content_for?(:body_id), कोड की तरह होगा।

<%= content_for?(:body_id) ? yield(:body_id) : 'super_admin_main' %> 
संबंधित मुद्दे