रेल- नेस्टेड content_tag


84

मैं इस तरह से कुछ बनाने के लिए एक कस्टम सहायक में सामग्री टैग घोंसला बनाने की कोशिश कर रहा हूँ:

<div class="field">
   <label>A Label</label>
   <input class="medium new_value" size="20" type="text" name="value_name" />
</div>

ध्यान दें कि इनपुट एक फॉर्म से जुड़ा नहीं है, इसे जावास्क्रिप्ट के माध्यम से सहेजा जाएगा।

यहाँ सहायक है (यह और अधिक करेगा फिर बस html प्रदर्शित करेगा):

module InputHelper
    def editable_input(label,name)
         content_tag :div, :class => "field" do
          content_tag :label,label
          text_field_tag name,'', :class => 'medium new_value'
         end
    end
end

<%= editable_input 'Year Founded', 'companyStartDate' %>

हालाँकि, लेबल प्रदर्शित नहीं होता है जब मैं सहायक को कॉल करता हूं, तो केवल इनपुट प्रदर्शित होता है। यदि यह text_field_tag ​​को टिप्पणी करता है, तो लेबल प्रदर्शित होता है।

धन्यवाद!

जवाबों:


155

आपको +जल्दी ठीक करने की आवश्यकता है : डी

module InputHelper
  def editable_input(label,name)
    content_tag :div, :class => "field" do
      content_tag(:label,label) + # Note the + in this line
      text_field_tag(name,'', :class => 'medium new_value')
    end
  end
end

<%= editable_input 'Year Founded', 'companyStartDate' %>

के ब्लॉक के अंदर content_tag :div, केवल अंतिम लौटा हुआ स्ट्रिंग प्रदर्शित किया जाएगा।


1
टाइपो (केवल टिप्पणी में, लेकिन थोड़ा भ्रमित) - " इस पंक्ति में ई नहीं +"
— चौलेट

उसको जोड़ने के बाद, मुझे सिंटैक्स त्रुटि मिलती है: सिंटैक्स त्रुटि, अप्रत्याशित tIDENTIFIER, kDO या '{' या '(' text_field_tag ​​नाम, '', अपेक्षा: वर्ग => 'मध्यम new_value' ^ ^ ^
— क्रिस्टो 16

2
यह गंदा लगता है ... ऐसा इसलिए है क्योंकि यह सहायक के लिए कई कंटेंट टैग बनाने के लिए एक प्रतिमान है?
— एरिक ट्रॉटमैन

मेरे लिए काम नहीं किया, concatअन्य उत्तरों की तरह उपयोग करने का सुझाव दिया था
— Dex

55

आप कॉन्कैट विधि का उपयोग भी कर सकते हैं :

module InputHelper
  def editable_input(label,name)
    content_tag :div, :class => "field" do
      concat(content_tag(:label,label))
      concat(text_field_tag(name,'', :class => 'medium new_value'))
    end
  end
end

स्रोत: रेलिंग 3 में नेस्टिंग सामग्री_टैग


यह मेरे लिए तब तक काम करता था जब तक 1 लाइन पर कॉनैट लाइन होती थी। हालांकि, मैं इसके साथ खेलने में लंबा समय नहीं बिता पाया, इसलिए शायद इसे मल्टी-लाइन करने का एक तरीका है
— टेरीस

यह html_safe समस्या पर विचार करने का एक बेहतर तरीका होगा। +गैर- htmlsafe स्ट्रिंग के बीच उपयोग करने से गैर-htmlsafe
— Tian Chen

यदि आप एक फॉर्म बिल्डर क्लास के अंदर हैं, तो यह होना चाहिए@template.concat
— elquimista

मुझे लगता है कि यह करने के लिए एक क्लीनर समाधान तरीका है +। अधिक पठनीय और रूबोपॉप पसंद नहीं है+
— 15

2

मैं गहरी घोंसले के शिकार में मदद करने के लिए एक चर और समतल का उपयोग करता हूं।

def billing_address customer
  state_line = content_tag :div do
    concat(
      content_tag(:span, customer.BillAddress_City) + ' ' +
      content_tag(:span, customer.BillAddress_State) + ' ' +
      content_tag(:span, customer.BillAddress_PostalCode)
    )
  end
  content_tag :div do
    concat(
      content_tag(:div, customer.BillAddress_Addr1) +
      content_tag(:div, customer.BillAddress_Addr2) +
      content_tag(:div, customer.BillAddress_Addr3) +
      content_tag(:div, customer.BillAddress_Addr4) +
      content_tag(:div, state_line) +
      content_tag(:div, customer.BillAddress_Country) +
      content_tag(:div, customer.BillAddress_Note)
    )
  end
end

1

निर्माण सामग्री के टैग के साथ चलना थोड़ा अलग है और मुझे हर बार मिलता है ... यहाँ एक विधि है:

      content_tag :div do
        friends.pluck(:firstname).map do |first| 
          concat( content_tag(:div, first, class: 'first') )
        end
      end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.