In Rails, Wat is die beste manier om AutoComplete dat Name Programme maar gebruik ID's te kry?
-
09-06-2019 - |
Vra
Ek wil 'n tekskassie dat die gebruiker kan tik in wat toon 'n Ajax-bevolk lys van name my model se, en dan wanneer die gebruiker kies een wat ek wil hê dat die HTML om die model se ID te red, en gebruik dit wanneer die vorm ingedien word.
Ek het al skeer by die auto_complete plugin wat het uitgesny in Rails 2, maar dit lyk of daar geen aanduiding dat hierdie nuttig kan wees nie. Daar is 'n Railscast episode dat die gebruik van daardie prop dek, maar dit beteken nie raak oor hierdie onderwerp. Die kommentaar wys daarop dat dit 'n kwessie kan wees, en punt om model_auto_completer
as 'n moontlike oplossing , wat blyk te werk as die besigtig items is eenvoudig snare, maar die plaas teks sluit baie van rommel spasies, indien (soos ek graag wil doen) jy 'n prentjie in die lys items, ten spyte van wat die dokumentasie sê .
Ek kon waarskynlik hack model_auto_completer
in vorm, en ek kan nog steeds eindig om dit te doen, maar ek is gretig om uit te vind of daar beter opsies wat daar is.
Oplossing 2
Ek het 'n geykte fix vir die rommel ruimtes van die beeld het. Ek het ook 'n :after_update_element => "trimSelectedItem"
om die opsies hash van die model_auto_completer
(dit is die eerste hash van die drie gegewe). My trimSelectedItem
vind dan die toepaslike sub-element en maak gebruik van die inhoud van wat vir die element waarde:
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
}
Dit is egter loop dan afoul van die :allow_free_text
opsie, wat by verstek verander die teks terug sodra die teks boks verloor fokus as die teks binne is nie 'n "geldige" item uit die lys. So moes ek afskakel wat ook deur ':allow_free_text => true
in die opsies hash (weer, die eerste hash). Ek sal regtig eerder dit gebly op, al is.
So my huidige oproep aan die autocompleter skep is:
<%= 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'}) %>
En die produkte / index.js.erb is:
<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>
Ander wenke
Ek gerol my eie. Die proses is 'n bietjie ingewikkelde, maar ...
Ek het net 'n text_field op die vorm met 'n waarnemer. Wanneer jy begin tik in die veld teks, die waarnemer stuur die search string en die kontroles gee 'n lys van voorwerpe (maksimum van 10).
Die voorwerpe word dan gestuur word aan lewer via 'n gedeeltelike wat vul die dinamiese outomaties resultate. Die gedeeltelike vult eintlik link_to_remote lyne wat weer terug te plaas om die kontroleerder. Die link_to_remote stuur die id van die gebruiker seleksie en dan skoon sommige RJS die soek, vul in die naam in die veld teks, en dan plaas die gekose id in 'n verborge vorm veld.
Sjoe ... ek kon nie 'n plugin om dit te doen op die tyd te vind, so ek gerol my eie, ek hoop almal wat sin maak.