В Rails, каков наилучший способ получить автозаполнение, которое показывает имена, но использует идентификаторы?

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

Вопрос

Я хочу иметь текстовое поле, которое пользователь может ввести, в котором отображается список имен моей модели, заполненный Ajax, а затем, когда пользователь выбирает одно, я хочу, чтобы HTML сохранял идентификатор модели и использовал его при отправке формы.

Я тыкал в плагин auto_complete, который был удален в Rails 2, но, похоже, он не подозревает, что это может быть полезно.Там есть Эпизод Railscast это касается использования этого плагина, но не затрагивает эту тему.Комментарии укажите, что это может быть проблемой, и указать на model_auto_completer в качестве возможного решения, который, кажется, работает, если просматриваемые элементы представляют собой простые строки, но вставленный текст содержит много ненужных пробелов, если (как я хотел бы сделать) вы добавляете картинку в элементы списка, несмотря на то, что говорится в документации.

Вероятно, я мог бы взломать model_auto_completer в форму, и я все еще могу в конечном итоге это сделать, но мне не терпится узнать, есть ли где-нибудь варианты получше.

Это было полезно?

Решение 2

У меня есть избитое исправление ненужных пробелов на изображении.Я добавил :after_update_element => "trimSelectedItem" к хэшу параметров model_auto_completer (это первый хэш из трех приведенных).Мой trimSelectedItem затем находит соответствующий подэлемент и использует его содержимое в качестве значения элемента:

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
}

Однако тогда это противоречит :allow_free_text опция, которая по умолчанию изменяет текст обратно, как только текстовое поле теряет фокус, если текст внутри не является "допустимым" элементом из списка.Так что мне пришлось отключить и это, пройдя мимо :allow_free_text => true в хэш параметров (опять же, первый хэш).Хотя я бы действительно предпочел, чтобы он остался включенным.

Итак, мой текущий вызов для создания автозаполнителя таков:

<%= 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'}) %>

А products/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>

Другие советы

Я свернул свой собственный.Процесс немного запутанный, но...

Я только что создал text_field в форме с помощью observer.Когда вы начинаете вводить текст в текстовое поле, наблюдатель отправляет строку поиска, а контроллер возвращает список объектов (максимум 10).

Затем объекты отправляются на рендеринг с помощью partial, который заполняет результаты динамического автозаполнения поиска.Частичное фактически заполняет строки link_to_remote, которые снова отправляются обратно в контроллер.link_to_remote отправляет идентификатор выбранного пользователем, а затем некоторые RJS очищают поиск, заполняют имя в текстовом поле, а затем помещают выбранный идентификатор в скрытое поле формы.

Фух...В то время я не мог найти плагин для этого, поэтому я создал свой собственный, надеюсь, все это имеет смысл.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top