Почему автозаполнение не отправляет запрос JSON - PullRequest
1 голос
/ 06 апреля 2011

Я пытаюсь использовать автозаполнение Jquery-UI в своем приложении rails. Внутри моего application.js у меня есть строка

$j('#autocomplete').autocomplete({ source:'contexts/1.json' });

Из того, что я прочитал в документации, функция ожидает получения данных json, поэтому внутри моего метода context_controller Show у меня есть следующее

def show
@context = Context.find(params[:id])
if params[:term]
  @tags = Tag.find(5, :conditions => ['name LIKE ? AND context_id = ?',params[:q], @context.id])
else
  @tags = Tag.find(:all, :conditions => ["context_id = ?",@context.id])
end
respond_to do |format|
  format.html
  format.json { render :json => @tags}
end

конец

Проблема в том, что сервер, похоже, не получает запрос, когда я начинаю печатать в поле ввода, к которому присоединено автозаполнение. Как я могу сделать эту работу?

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

После долгих поисков в сети я понял, что допускаю несколько небольших критических ошибок. Первое, что я изменил, это поместил JavaScript в $j(document).ready(function(){, чтобы он теперь читал

$j(document).ready(function() {
  $j('#autocomplete').autocomplete({
    source: '/contexts/1'
  });
});

Не совсем уверен, почему это имело значение, может быть, кто-то может сказать мне.

После того, как я это сделал, я увидел, что он правильно отправляет запрос json на сервер и получает что-то обратно, но в меню автозаполнения ничего не добавляется. С этого момента я понял, что автозаполнение пользовательского интерфейса jQuery заполняет меню атрибутом сериализованного объекта под названием «значение». У моей модели не было этого атрибута. Я исправил это, добавив метод (виртуальный атрибут) «value» в мой файл модели Tag.rb. и изменил мой контроллер, чтобы он возвращал атрибут «значение» вместе с объектом. format.json { render :json => @tags.to_json(:methods=>:value)}

Хотя у меня теперь был сериализованный объект с атрибутом 'value', он все еще не работал. Последний шаг, который я должен был сделать, - это чтобы метод .to_json () не возвращал тип объекта в качестве корневого. Это находится внутри config / initializers / new_rails_defaults.rb

ActiveRecord::Base.include_root_in_json = false

После всего этого я смог заставить автозаполнение работать в моем проекте rails, не привязывая себя к плагину, который не имел всех функций, которые мне бы понравились.

0 голосов
/ 11 апреля 2011

Что касается JavaScript, вот пример того, что я использовал в прошлом. Имейте в виду, что это запрос к службе .NET WCF, но с точки зрения javascript это не должно иметь значения.

'# autocomplete' - это простое текстовое поле html

    function split(val) {
        return val.split(/,\s*/);
    }
    function extractLast(term) {
        return split(term).pop();
    }

    $('#autocomplete').autocomplete({
        source: function (request, response) 
            {$.getJSON("URLThatReturnsJSON", {
                  name: extractLast(request.term),
                  context_id: $('.context_id').val()
                  }, function (msg) {
                        return response(msg.d);
                  });
               }

Вот пример того, что отправляется на сервер .. (08 - пример чего-то в текстовом поле автозаполнения) http://localhost/URLThatReturnsJSON?name=08&context_id=1

Вот пример того, что возвращается { "D": [ "0008", "0827", "0849", "0866", "0882", "0804"]}

По соображениям безопасности службы WCF предпочитают устанавливать имя свойства d при идентификации списка данных. Отсюда причина, по которой в моей функции ответа я упоминаю как msg.d Возможно, в ruby, вы можете просто сделать сообщение.

Редактировать Одна вещь, которую я забыл упомянуть, это то, что в моем примере используется текстовое поле с несколькими значениями, это означает, что я пытаюсь использовать автозаполнение для более чем одной записи в текстовом поле, т.е. текстовое поле может содержать 09, bill, abc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...