8

Ich habe dieses Video http://railscasts.com/episodes/102-auto-complete-association-revised verwendet, um eine Autocomplete-Sucheingabe in einem Formular für meine App einzurichten. (Das Video ist möglicherweise nur für Mitglieder, also poste ich auch meinen Code. Im Wesentlichen durchsucht es eine Spalte des DB (Name) und vervollkommnet in einem Dropdown, während Sie tippen. Das alles funktioniert aber gut, was ich gerne hätte Formular zu tun ist, senden Sie die ID, die korreliert mit dem Namen, nicht der Name selbst.Rails: Wie kann ich die Suche nach Name automatisch vervollständigen, aber ID speichern?

Ich gehe davon aus, es gibt keine einfache Möglichkeit, dies nur in der Ansicht zu tun. Jede Hilfe wäre toll. Code unten, lass es mich wissen wenn ein anderer Code wäre hilfreich

Dank

Controller:.

def game_name 
    game.try(:name) 
end 

def game_name=(name) 
    self.game = Game.find_by_name(name) if name.present? 
end 

Coffee:

jQuery -> 
$('#play_game_name').autocomplete 
    source: $('#play_game_name').data('autocomplete-source') 

Nach Ansicht:

<%= f.label :game_name, "Search for a game" %> 
    <%= f.text_field :game_name, :class => "mlm mtm", data: {autocomplete_source: Game.order(:name).map(&:name)} %> 
+0

Wenn Sie Wert erhalten, wenn Sie DownKey oder UpKey drücken, suchen Sie nach [diesen Beitrag] [1] [1]: http://stackoverflow.com/questions/8045773/jquery-ui-autocomplete-downarrow-uparrow – Fist

Antwort

9

Zusätzlich zur Ausführung von @LukasSvoboda können Sie auch den Rückruf selectevent überschreiben, der ausgelöst wird, wenn Sie ein Element aus dem Dropdown auswählen. Im Callback können Sie das Textfeld (das nicht gesendet werden muss) auf das "Label" des ausgewählten Elements setzen und den Wert eines versteckten Feldes der Game-ID (die nicht gesendet werden muss) festlegen der "Wert" des ausgewählten Artikels.

In Kaffee:

jQuery -> 
    $('#play_game_name').autocomplete 
    source: $('#play_game_name').data('autocomplete-source') 
    select: (event, ui) -> 

    # necessary to prevent autocomplete from filling in 
    # with the value instead of the label 
    event.preventDefault() 

    $(this).val ui.item.label 
    $('#game_id').val ui.item.value 

In Markup:

<%= text_field_tag nil, nil, :id => 'play_game_name', :class => "mlm mtm", data: {autocomplete_source: Game.order(:name).map { |t| { :label => t.name, :value => t.id } } %> 
<%= f.hidden_field :game_id, id: 'game_id' %> # tailor to your model 
+0

Danke für Ihre Antwort. Die automatische Vervollständigung funktioniert immer noch, aber alles danach scheint nicht zu funktionieren. Der Sucheingang zeigt weiterhin den Wert an, nachdem Sie auf das Drop-down-Menü geklickt haben, und der verborgene Eingang erhält keinen Wert. Ungerade. Es ist wie alles, nachdem die automatische Vervollständigung nicht funktioniert. Es gibt keine JS-Fehler = \ –

+0

Mein Einzug war ein wenig aus, aber ich nehme an, Sie haben das an Ihrem Ende behoben. Haben Sie versucht, im ausgewählten Callback eine Warnung zu platzieren, um zu sehen, ob die Nachricht mindestens ausgelöst wird? – cdesrosiers

+0

Ja, ich habe die Vertiefung an meinem Ende fixiert. Ich räumte ein paar andere JS auf, weil ich dachte, dass etwas anderswo mir Probleme bereiten würde. Wenn ich alles außer jquery und jquery UI zurücksetze, erhalte ich den folgenden Fehler: "Uncaught ReferenceError: ui ist nicht definiert". Super komisch, irgendwelche Gedanken? –

3

Durch die http://api.jqueryui.com/autocomplete/#option-source Sie auf die Autocomplete-Datensatz kann.

Sie müssen die text_field Linie ändern wie:

<%= f.text_field :game_name, :class => "mlm mtm", data: {autocomplete_source: Game.order(:name).map { |t| { :label => t.name, :value => t.id } } %> 

Für erweiterte Funktionen betrachten select2 oder gewählt zu verwenden.

+0

Vielen Dank für Ihre Antwort! Ein paar Anmerkungen: Es gibt eine} in Ihrem Code fehlt (kein Problem, reparierte es an meinem Ende). Ihre Lösung funktioniert, aber die ID wird nach der automatischen Vervollständigung in der Eingabe angezeigt. Würde es eine einfache Möglichkeit geben, den Spielnamen anzuzeigen und die ID zu übermitteln, ohne dass der Benutzer jemals die ID-Nummer sehen kann? –

Verwandte Themen