#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, но затем обнаруживает в ответе что-то, что синтаксически недопустимо для этого типа. Попробуйте временно изменить поле типа данных в вашем вызове на «текст». Посмотрите, поможет ли это вам преодолеть эту ошибку и увидеть, что вы на самом деле получаете обратно с сервера.
Кстати:
- В документах для jQuery.ajax не указано «js» в качестве допустимого аргумента для типа данных. Вероятно, вместо этого вам нужен «script» или, может быть, «json» или «jsonp».
- Если тип данных not не задан, и я подозреваю, что он недействителен, то $.ajax пытается вывести тип из MIME-типа ответа.
Редактировать: Я должен был также упомянуть — если вы работаете с Firebug или чем-то эквивалентным, попробуйте использовать вкладку Net для проверки ответа сервера. Учитывая MIME-тип ответа, является ли он синтаксически допустимым? Если нет, вам нужно либо исправить ответ, поступающий с сервера, либо исправить тип MIME, установленный в ответе, либо изменить тип данных в вызове $.ajax.