2012-12-04 15 views
5

अभी, मैं मॉडल से डेटा के साथ एक चयन बॉक्स बनाने के लिए form_for.select और options_for_select रेल मददगार का उपयोग कर रहा हूं।RoR 3.2.8: क्या कोई HTML5 combobox सहायक है?

<input type=text list=browsers > 
<datalist id=browsers > 
    <option> Google 
    <option> IE9 
</datalist> 

इस तरह के तत्वों को बनाने के लिए एक रेल सहायक है: हालांकि, क्या मैं वास्तव में जरूरत है एचटीएमएल 5 के साथ पेश किया जैसे किसी ऐसे बता गया है?

+0

एक दूसरे नज़र पर एक दूसरे रुको, कि नहीं लगती है वैध एचटीएमएल की तरह, क्या आप वाकई सही हैं? – Noz

+0

@CyleHunter डब्ल्यू 3 सी का कहना है कि इसकी वैध –

उत्तर

4

नहीं है, लेकिन यह सेटअप अपने खुद के रूप बिल्डर सहायक इस तरह के एक परिणाम प्राप्त करने के विधि के लिए काफी आसान है, एक साधारण उदाहरण होगा:

एप्लिकेशन/form_builders/combobox_form_builder.rb

class ComboboxFormBuilder < ActionView::Helpers::FormBuilder 
    include ActionView::Context # for nested content_tag 
    include ActionView::Helpers::FormTagHelper #for sanitize_to_id method access 

    def combobox_tag(name, options, opts= {}) 
    @template.content_tag(:input, :name => name, :id => sanitize_to_id(name), :type => "text", :list => opts[:list_id]) do 
     content_tag(:datalist, :id => opts[:list_id]) {options} 
    end  
    end  
end 

अपने सर्वर को पुनरारंभ करने के बाद आप फॉर्म बिल्डर का उपयोग करके अपने नए combobox को अपने form_for कॉल में एक बिल्डर तर्क निर्दिष्ट करके कार्यान्वित कर सकते हैं:

<%= form_for @foo, builder: ComboboxFormBuilder do |f| %> 
    <%= f.combobox_tag(:browser, options_for_select(["Firefox", "Chrome", "IE9"]), :list_id => "list")%> 
<% end %> 

आउटपुट HTML:

<input type="text" name="browser" list="list" id="browser"> 
<datalist id="list"> 
    <option value="Firefox">Firefox</option> 
    <option value="Chrome">Chrome</option> 
    <option value="IE9">IE9</option> 
</datalist> 

ध्यान रखें कि दोनों आईई & सफारी एचटीएमएल 5 Datalist के लिए समर्थन नहीं करते हैं।

+0

नहीं जानता था कि यह इतना आसान हो सकता है, मुझे इसे आज़माएं। –

+0

मैं फॉर्म और मॉडल पैरामीटर कैसे पास कर सकता हूं? जब आप form_for.field बनाते हैं तो यह जानता है कि नाम और आईडी –

+1

कैसे बनाएं, http://stackoverflow.com/questions/7238798/adding-a-method-to-formbuilder-that-calls-a-helper- विधि-वह-प्रस्तुतकर्ता-आंशिक आपको या तो अपना स्वयं का फॉर्मबिल्डर सबक्लास बनाना होगा और इसका उपयोग करना होगा, या आप रूबी के मेटाप्रोग्रामिंग का उपयोग करके बंदर-पैच फॉर्मबिल्डर कर सकते हैं। मुझे पूरा यकीन है कि पूर्व इसे करने का पसंदीदा तरीका है, लेकिन दोनों को काम करना चाहिए। आप डिफ़ॉल्ट रूप से अपने नए फॉर्मबिल्डर का उपयोग करने के लिए अपने ऐप में form_for ओवरराइड कर सकते हैं, इसलिए आपको बहुत से कोड बदलने की आवश्यकता नहीं है। – mrbrdo

0

बस उदाहरण मेरे कोड से:

= form_tag controller:'beer', action: 'create' do 
    = text_field :beer, :name, list: 'beer-name' 
    %datalist#beer-name 
    - Beer.all.each do |beer| 
     %option{value: beer.name} 
1
<%= form_for @person do |f| %> 
    <%= f.label :first_name, "First Name" %>: 
    <%= f.text_field :first_name, list: 'first-name' %> 
    <datalist id="first-name"> 
    <% Person.all.each do |person| %> 
     <option value="<%= person.first_name %>"></option> 
    <% end %> 
    </datalist> 
    <%= f.submit %> 
<% end %> 

तुम भी अलग क्या करना चाहते हो सकता है:

<% Person.select(:first_name).distinct.each do |person| %>