Проблема с обработкой ответов jQuery.ajax в контроллере

#jquery #ruby-on-rails #ruby #ruby-on-rails-3 #response

#jquery #ruby-on-rails #ruby #ruby-on-rails-3 #ответ

Вопрос:

Я использую Ruby on Rails 3.0.7 и jQuery 1.6.1. Я пытаюсь реализовать AJAX-запрос, используя $.ajax() синтаксис jQuery, и у меня проблема с ответом, для которого всегда срабатывает обратный вызов с ошибкой, и это приводит к переполнению стека.

Примечание: маршрутизатор успешно установлен.

В контроллере у меня есть:

 def test_method
  ...
  respond_to do |format|
    format.js
  end
end
  

Код jQuery AJAX для запроса является:

 $('#test_html_css_id').bind('click', function() {
  $.ajax({
    type: "POST",
    url: "<%= user_url(@user)%>/test_method",
    data: "test_data=<%=  @user.test_data.to_s %>",
    dataType: 'js',
    error: function(jqXHR){
      alert( "ERROR "   jqXHR );
    },
    success: function(jqXHR){
      alert( "SUCCESS "   jqXHR );
    }
  });
});
  

В приведенном выше примере для click события он всегда возвращает следующее предупреждающее сообщение:

 ERROR [object Object]
  

Как я могу явно вернуть ответ об успехе или ошибке в моем контроллере?


Кстати: Как я могу вернуть некоторые данные с контроллера, а затем обработать их с помощью триггера в коде jQuery?


ОБНОВЛЕНО после комментария @dgvid

Используя в коде jQuery это

 error: function(xhr, status, ex) {
    var msg = "";
    if (xhr) {
      msg = "readyState is "   xhr.readyState   ". ";
    }
    if (ex) {
      msg  = ex.name   ' - '   ex.message;
    }
    alert("ERROR "   msg); },
  

Я получаю следующее предупреждающее сообщение:

 ERROR readyState is 4. SyntaxError - invalid label
  

Что это значит?

Комментарии:

1. Вы пробовали запускать это при удалении свойства ‘DataType’ из вызова ajax?

2. Чтобы извлечь некоторую полезную информацию из обратного вызова с ошибкой, попробуйте вместо этого следующее: ошибка: функция(xhr, status, ex) { var msg = «»; if (xhr) { msg = «readyState is » xhr.readyState «. «; } if (ex) { msg = ex.name ‘ -‘ примерное сообщение; } предупреждение («ОШИБКА» сообщение об ошибке); }

3. @John Kalberer — Это то же самое со свойством ‘DataType’ или без него.

4. Сначала вы должны проверить, что именно возвращается с сервера, просто попробуйте проверить ваш jqXHR — JSON.parse(jqXHR) (вы можете поместить это в свою консоль с помощью console.log(JSON.parse(jqXHR)))

Ответ №1:

Как я могу явно вернуть ответ об успешном завершении или ошибке в моем контроллере?

Вы можете сделать это, используя коды состояния HTTP, 200 — это успех, а 500 — ошибка сервера. Поэтому попробуйте использовать какой-нибудь код вроде:

 if @object 
  respond_to do |format|
    format.js
  end
else
  render :nothing => true, :status => 500
end
  

Ответ №2:

Исключение SyntaxError с сообщением «недопустимая метка», вероятно, указывает на то, что метод $.ajax пытается проанализировать данные ответа либо как JavaScript, либо как JSON, но затем обнаруживает в ответе что-то, что синтаксически недопустимо для этого типа. Попробуйте временно изменить поле типа данных в вашем вызове на «текст». Посмотрите, поможет ли это вам преодолеть эту ошибку и увидеть, что вы на самом деле получаете обратно с сервера.

Кстати:

  1. В документах для jQuery.ajax не указано «js» в качестве допустимого аргумента для типа данных. Вероятно, вместо этого вам нужен «script» или, может быть, «json» или «jsonp».
  2. Если тип данных not не задан, и я подозреваю, что он недействителен, то $.ajax пытается вывести тип из MIME-типа ответа.

Редактировать: Я должен был также упомянуть — если вы работаете с Firebug или чем-то эквивалентным, попробуйте использовать вкладку Net для проверки ответа сервера. Учитывая MIME-тип ответа, является ли он синтаксически допустимым? Если нет, вам нужно либо исправить ответ, поступающий с сервера, либо исправить тип MIME, установленный в ответе, либо изменить тип данных в вызове $.ajax.