8

Ho utilizzato questo video http://railscasts.com/episodes/102-auto-complete-association-revised per impostare un input di ricerca di completamento automatico in un modulo per la mia app. (Il video potrebbe essere riservato ai membri, quindi pubblicherò anche il mio codice. Cerca essenzialmente una colonna del DB (nome) e dei completamenti automatici in un menu a discesa durante la digitazione. Tutto questo funziona comunque, ciò che mi piacerebbe fosse modulo da fare è inviare l'ID che si correla al nome, non al nome stessoRails: come faccio a completare automaticamente la ricerca di Nome ma a salvare l'ID?

Suppongo che non ci sia un modo semplice per farlo nel solo panorama.Qualsiasi aiuto sarebbe fantastico. Codice di seguito, fammi sapere se qualsiasi altro codice sarebbe utile

Grazie

controller:.

def game_name 
    game.try(:name) 
end 

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

Caffè:

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

Nella vista:

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

Se avete ottenere valore quando si preme DownKey o UpKey, cercare [questo post] [1] [1]: http://stackoverflow.com/questions/8045773/jquery-ui-autocomplete-downarrow-uparrow – Fist

risposta

9

Oltre a fare come suggerito @LukasSvoboda, è anche possibile ignorare la richiamata selectevent, che viene attivata quando si seleziona un elemento dal menu a discesa. Nel callback, puoi impostare il campo di testo (che non è necessario inviare) alla "label" dell'elemento selezionato e impostare il valore di un campo nascosto dell'id del gioco (che deve essere inviato) a il "valore" dell'elemento selezionato.

In caffè:

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 marcatura:

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

Grazie per la risposta. Il completamento automatico funziona ancora ma dopo tutto non sembra funzionare. L'input di ricerca visualizza ancora il valore dopo aver fatto clic sul menu a discesa e l'input nascosto non ottiene alcun valore. Dispari. È come se tutto dopo il completamento automatico non funzionasse. Non ci sono errori JS = \ –

+0

La mia indentazione è stata un po 'spenta, ma presumo che l'hai riparata da te. Hai provato a inserire un avviso nel callback selezionato per vedere se è almeno in fase di attivazione? – cdesrosiers

+0

Sì, ho riparato la rientranza sulla mia estremità. Ho ripulito un sacco di altri JS perché ho pensato che qualcosa altrove mi stesse causando alcuni problemi. Quando richiudo tutto eccetto jquery e jquery UI ottengo il seguente errore: "Uncaught ReferenceError: ui is not defined". Super strano, qualche pensiero? –

3

Con i dati http://api.jqueryui.com/autocomplete/#option-source è possibile impostare per il completamento automatico.

È necessario modificare la linea text_field come:

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

Per funzioni più avanzate in considerazione di utilizzare select2 o scelto.

+0

Grazie mille per la tua risposta! Un paio di note: c'è un} mancante nel codice (non un problema, risolto dal mio lato). La soluzione funziona ma l'ID viene visualizzato nell'input dopo il completamento automatico. Ci sarebbe un modo semplice per visualizzare il nome del gioco e inviare l'ID senza che l'utente abbia mai visto il numero identificativo? –

Problemi correlati