Как вернуть правильные данные JSON из контроллера Rails в поле выбора автозаполнения jQuery? - PullRequest
1 голос
/ 11 октября 2011

Я очень стараюсь реализовать пример «combo box» пользовательского интерфейса jQuery.Я установил удаленный источник данных, и он возвращает значения, которые я ввожу. Однако он работает только в том случае, если я возвращаю массив строк, например:

render :text => Product.find_by_sql("select id, part_number from products where part_number like '#{params[:term]}%'").collect{|p| p.part_number}.to_json

Что я действительно хочу сделать,конечно, он должен также возвращать идентификатор объекта AR.К сожалению, когда я пытаюсь вернуть их оба в подмассив, я получаю кучу «неопределенных» значений в моем поле со списком.

Вот событие «select», которое срабатывает в моем поле со списком:

            select: function( event, ui ) {
                ui.item.option.selected = true;
                self._trigger( "selected", event, {
                    item: ui.item.option
                });
            },

Я просматривал документацию по пользовательскому интерфейсу jQuery и не могу понять, что на самом деле делает этот код.Кроме того, я не могу понять, какой должна быть структура JSON, который мне нужно вернуть.

Ответы [ 2 ]

1 голос
/ 11 октября 2011

Я не могу говорить за ту часть, над которой вы работаете, но я знаю, что формат, который ожидает виджет автозаполнения, выглядит следующим образом:

Локальные данные могут быть простым массивом строк или содержать Объекты для каждого элемента в массиве, с меткой или значением собственность или оба .

Что означает вышеизложенное, так это то, что если вы не возвращаете простые Array строк, у вас должен быть массив объектов, который включает как минимум свойство метки или значения (объекты в Массив может содержать другие вещи, виджет не заботится). Например, следующее будет работать нормально (и вы можете получить доступ к свойству id в обработчиках событий (например, ui.item.id)

[{ label: 'Google', id: '1234' }, { label: 'Yahoo', id: '2345' }, ... ];
<ч />

Относительно вашего второго вопроса:

Я просматривал документацию по пользовательскому интерфейсу jQuery и не могу понять, что на самом деле делает этот код.

Предполагаемый фрагмент кода должен изменить базовый элемент select в выпадающем списке и установить соответствующий option в качестве выбранного. Если вы используете удаленный источник данных, вы, вероятно, можете обойтись без этого полностью.

1 голос
/ 11 октября 2011

Вам необходимо вернуть массив хэшей, каждый из которых имеет два атрибута - id и label.

Я использовал это с успехом:

collect{|p| {:label=>p.name, :id=>p.id}}.to_json

(я думаю, что вы хотели бы вызвать part_number вместо имени для вашего объекта, но это формат)

Отдельно, я думаю, что ваш код открыт для SQL инъекций, вы должны использовать «как?»синтаксис.

Product.where( "part_number like ?", "#{params[:term]}%" )

Также есть этот драгоценный камень, который я не использовал, но должен работать:

https://github.com/crowdint/rails3-jquery-autocomplete

...