रेल- नेस्टेड 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.