Ajax Autocomplete per Rails con passaggio di “id”
Un limite dell’autocomplete è che il valore che viene passato in post è quello presente nella textbox utilizzata per l’autocomplete, questo significa che per recuperare l’id associato a quel valore dovete eseguire un accesso al database che in realtà è inutile!
Per evitare questo problema potreste creare un helper per l’autocomplete leggermente diverso, che sull’after_update dell’autocomplete esegua un js ch aggiorna una text_field da passare in post alla funzione prevista.
Ecco il text_field_id_with_auto_complete:
1
Nella vostra vista usate questo codice:
1 2 3 4 5
In questo modo dopo aver scelto il valore suggerito dall’autocomplete parte il js (quello della funzione nell’helper) che aggiorna l’hidden_field da passare in post. Qui vedete il codice da mettere nel vostro controllore, questa funzione prende il valore passato dalla textbox e restituisce una collezione di risultati che popoleranno il div dei suggerimenti:
1
Il parziale “_user”:
1 2 3 4 5 6 7 8
Il js usa una funzione che è getElementByClassName da mettere nell’application.js:
1 2 3 var a = ; 4 var re = '\\b' + classname + '\\b'; 5 var els = nodegetElementsByTagName"*"; 6 forvar i=0j=elslength; i<j; i++ 7 ifretestelsiclassNameapushelsi; 8 return a; 9
Addesso in post avrete l’id dell’oggetto selezionato nei suggerimenti dell’autocomplete, in questo modo evitate una inutile query testuale per recuperare l’id.


Salve,
Ho provato la tua soluzione. Mi funziona in parte; ovvero mi viene correttamente caricato la variabile definita ‘hidden’ ma non vi viene piu’ aggiornato il campo testuale relativo.
In piu’ ho la necessita’ di utilizzare piu’ di un campo che faccia uso dell’auto-complete . In questo modo selezioando piu’ di un valore nei rispettivi campi, mi vendono caricati i campo ‘hiden’ tutti con lo stesso valore.
Puoi per favore darmi qualche indicazione in merito?
Cordiali saluti
Stefano
Ciao Stefano,
allora per quanto riguarda il fatto che non ti sia aggiorna la textbox dell’autocomplete dipende dal parziale che usi per renderizzare i risultati… c’è un problema lì magari nel “choosethis“. Per il fatto di volere più campi “hidden” con autocomplete diversi modifica l’helper sostituendo a document.getElementById(”friend_id”) l’object (in teoria se ne hai più di un autocomplete sono diversi) document.getElementById(”#{object}_id”).
Chiaramente ricorda di modificare anche l’object dell’hidden_field.
Ultima cosetta se vuoi puoi elimare la funzione getElementsByClassName e mettere il $$(”nome_classe”) del prototype! Spero sia chiara la risposta…
Duccio
Per rendere l’helper text_field_id_with_auto_complete utilizzabile universalmente basta sostituire al rigo 3 ‘friend_id’ con ’selected_id’ e all’interno della vista sostituire l’hidden field <%= hidden_field :friend, :id %> con <%= hidden_field :selected, :id %>.
In questo modo l’helper può essere richiamato da qualsiasi vista ed in qualsiasi contesto, però i parametri ritornati dal form sono ovviamente diversi e andranno gestiti accuratamente nel controllore.