2012-12-04 7 views
5

Im Moment verwende ich die form_for.select und options_for_select Rails Helfer, um eine Auswahlbox mit den Daten aus dem Modell zu erstellen. Aber was ich wirklich brauchen, ist eine Combobox wie das mit HTML5 eingeführt:RoR 3.2.8: Gibt es einen HTML5-Combobox-Helfer?

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

Gibt es einen Schienen Helfer solche Elemente für das Erstellen?

+0

eine Sekunde auf den zweiten Blick Warten Sie, die aussehen nicht Wie gültiges HTML, bist du sicher, dass das richtig ist? – Noz

+0

@CyleHunter W3C sagt seine gültige –

Antwort

4

Nein, aber es ist ganz einfach Ihre eigenen Formular-Builder Helper-Methode zur Einrichtung ein solches Ergebnis zu erreichen, ist ein einfaches Beispiel wäre:

app/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 

Nach dem Neustart des Servers können Sie das neue Kombinationsfeld mithilfe des Formular-Generators implementieren, indem Sie ein Builder-Argument in Ihrem form_for-Aufruf angeben:

Output 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> 

Beachten Sie, dass beide IE & Safari bieten keine Unterstützung für die HTML5-Datenliste.

+0

wusste nicht, dass es so einfach sein könnte, lassen Sie mich es versuchen. –

+0

Wie kann ich die Formular- und Modellparameter übergeben? Wie beim Erstellen eines form_for.field weiß es, wie man den Namen und die ID erstellt –

+1

Schauen Sie sich http://StackOverflow.com/Questions/7238798/Adding-Amethod-To-FormBuilder-that-Calls-AHelper- method-that-rendert-a-partially Sie müssen entweder Ihre eigene FormBuilder-Unterklasse erstellen und diese verwenden, oder Sie können FormBuilder mithilfe der Metaprogrammierung von Ruby mit einem Patch versehen. Ich bin mir ziemlich sicher, dass Ersteres der bevorzugte Weg ist, aber beide sollten funktionieren. Sie können form_for in Ihrer App außer Kraft setzen, um Ihren neuen FormBuilder anstelle des Standardformulars zu verwenden, sodass Sie nicht viel Code ändern müssen. – mrbrdo

0

Gerade Beispiel aus meinem Code:

= 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 %> 

Sie auch verschiedene möchten tun:

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