В Rails, какой лучший способ получить автозаполнение, которое показывает имена, но использует идентификаторы? - PullRequest
4 голосов
/ 17 сентября 2008

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

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

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

Ответы [ 2 ]

1 голос
/ 17 сентября 2008

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

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

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

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

0 голосов
/ 17 сентября 2008

У меня есть исправленное место для ненужных мест на картинке. Я добавил :after_update_element => "trimSelectedItem" к хэшу опций model_auto_completer (это первый из трех данных хэшей). My 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...