In Rails, qual è il modo migliore per ottenere il completamento automatico che mostra i nomi ma utilizza gli ID?

StackOverflow https://stackoverflow.com/questions/81174

Domanda

Voglio avere una casella di testo in cui l'utente può digitare che mostri un elenco popolato da Ajax dei nomi del mio modello, quindi quando l'utente ne seleziona uno voglio che l'HTML salvi l'ID del modello e lo utilizzi quando il modulo viene inviato .

Ho dato un'occhiata al plugin auto_complete che è stato eliminato in Rails 2, ma sembra non avere la minima idea che possa essere utile.C'è un Episodio di Railcast che copre l'utilizzo di quel plugin, ma non tocca questo argomento.I commenti sottolineare che potrebbe essere un problema, E indicare model_auto_completer come possibile soluzione, che sembra funzionare se gli elementi visualizzati sono semplici stringhe, ma il testo inserito include molti spazi spazzatura se (come vorrei fare) includi un'immagine negli elementi dell'elenco, nonostante quello che dice la documentazione.

Probabilmente potrei hackerare model_auto_completer in forma, e potrei ancora finire per farlo, ma sono ansioso di scoprire se ci sono opzioni migliori là fuori.

È stato utile?

Soluzione 2

Ho una soluzione banale per gli spazi spazzatura dell'immagine.Ho aggiunto un :after_update_element => "trimSelectedItem" all'hash delle opzioni di model_auto_completer (questo è il primo hash dei tre forniti).Mio trimSelectedItem quindi trova il sottoelemento appropriato e ne utilizza il contenuto per il valore dell'elemento:

function trimSelectedItem(element, value, hiddenField, modelID) {
    var span = value.down('span.display-text')
    console.log(span)
    var text = span.innerText || span.textContent
    console.log(text)
    element.value = text
}

Tuttavia, questo poi entra in conflitto con :allow_free_text opzione, che per impostazione predefinita ripristina il testo non appena la casella di testo perde il focus se il testo all'interno non è un elemento "valido" dall'elenco.Quindi ho dovuto disattivare anche quello, passando :allow_free_text => true nell'hash delle opzioni (di nuovo, il primo hash).Preferirei davvero che rimanesse acceso, però.

Quindi la mia attuale chiamata per creare il completamento automatico è:

<%= model_auto_completer(
    "line_items_info[][name]", "", 
    "line_items_info[][id]", "",
    {:url => formatted_products_path(:js),
     :after_update_element => "trimSelectedItem",
     :allow_free_text => true},
    {:class => 'product-selector'},
    {:method => 'GET',  :param_name => 'q'}) %>

E prodotti/index.js.erb è:

 <ul class='products'>
    <%- for product in @products -%>
    <li id="<%= dom_id(product) %>">
            <%= image_tag image_product_path(product), :alt => "" %>
            <span class='display-text'><%=h product.name %></span>
    </li>
    <%- end -%>
 </ul>

Altri suggerimenti

Ho arrotolato il mio.Il procedimento è un po' contorto, ma...

Ho appena creato un text_field sul modulo con un osservatore.Quando inizi a digitare nel campo di testo, l'osservatore invia la stringa di ricerca e il controller restituisce un elenco di oggetti (massimo 10).

Gli oggetti vengono quindi inviati al rendering tramite un partial che compila i risultati dinamici della ricerca di completamento automatico.Il partial effettivamente popola le righe link_to_remote che eseguono nuovamente il postback al controller.link_to_remote invia l'ID della selezione dell'utente e quindi alcuni RJS ripuliscono la ricerca, compilano il nome nel campo di testo e quindi posizionano l'ID selezionato in un campo del modulo nascosto.

Uff...Non sono riuscito a trovare un plugin per farlo in quel momento, quindi ho creato il mio, spero che tutto abbia senso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top