Перенаправление при ajax-запросе

852 views
Skip to first unread message

Quaternion

unread,
Sep 16, 2009, 8:40:36 AM9/16/09
to RubyOnRails to russian
Используется jquery и плагин jquery form. На сервер методом post
уходит ajax-запрос, в контроллере делаем redirect_to. Фаербаг
показывает два запроса - первый возвращается со статусом 302, второй
200, затем срабатывает событие success скрипта. Есть ли какой-то
способ отловить 302 статус и перенаправить клиента? Т.е. требуется
сделать полноценный редирект после ajax-запроса. В прототипе как-то
проще сделано - там на все статусы есть обработчики вида on<номер>.

oruenu

unread,
Sep 16, 2009, 9:07:01 AM9/16/09
to RubyOnRails to russian
Отлавливать статус в oncomplete вместо onsuccess.

Quaternion

unread,
Sep 22, 2009, 3:05:36 AM9/22/09
to RubyOnRails to russian
Статус complete от success ничем не отличается, кроме того что
отрабатывает также и в случае ошибки, но все они отрабатывают только
после второго запроса. Вобщем проблема остается:
Допустим есть контроллер с методами new и show, на new пришел ajax и
нужно вернуть html. Если после этого new делает редирект на show, то
все, труба - show уже не знает что это был аякс, соответственно не
знает что html надо отрендерить без шаблона и т.д. и т.п.

Oleg Ivanov

unread,
Sep 22, 2009, 3:14:42 AM9/22/09
to ror...@googlegroups.com
так редиректите с указанием формата -
js, к примеру - и для данного формата
рендерите вид без шаблона
--
Oleg Ivanov
ICQ: 69991809
Jabber: morh...@morhekil.net




Quaternion

unread,
Sep 22, 2009, 4:08:03 AM9/22/09
to RubyOnRails to russian
Конечно это сработает, но больше похоже на костыли. Поизящнее решения
нет?

Julik Tarkhanov

unread,
Sep 22, 2009, 4:18:04 AM9/22/09
to ror...@googlegroups.com
Нет потому что тебе никто не
гарантирует что браузер последует по
редиректу. Оверрайди redirect_to чтобы он
при редиректе
выводил window.location = foo, это примерно
лучшее что ты можешь сделать. Ну или
дописать свою обертку поверх
прототайпа чтобы самому отрабатывать
редиректы (good luck with that).
--
Julik Tarkhanov
m...@julik.nl





Maxim Kulkin

unread,
Sep 22, 2009, 4:21:36 AM9/22/09
to ror...@googlegroups.com
+1 за решение с форматом. Оно Вам надо
так забарываться ? А на костыли это
похоже потому, что у Вас там решение
сомнительного качества:

Как я понял, после создания объекта
через Ajax, надо показать этот объект
(action "show"). Я бы положил посылку
яваскрипта на удаление формы и
отображение объекта в js-respond_to экшена
#create. Потому что #show может делаться из
разных мест, когда не понятно, надо ли
убирать форму или делать какое-то
другое действие.

Quaternion

unread,
Sep 22, 2009, 5:23:16 AM9/22/09
to RubyOnRails to russian
Спасибо за ответы. Сделал без редиректа, через render :action, правда
пришлось гору переменных определить для вьюхи.

Viza-

unread,
Sep 23, 2009, 11:59:26 AM9/23/09
to RubyOnRails to russian
Для работы с разными ответами от сервера я использую формат данных
JSON

Например, у нас имеется ссылка для удаления новости. Если юзер имеет
доступ, то новость должна удалиться и юзеру приходит мессага типо
"Успешно удалено". Иначе - редирект на страницу "нет доступа", если
кто-то подменит ссылку например.

Делается это очень просто. В контроллере пишем:

if request.xhr? # если запрос - аякс
response = Hash.new
if current_user.has_access_to_delete?
response[:status] = 'success'
response[:message] = 'Новость успешно удалена'
else
response[:status] = 'redirect'
response[:url] = '/news/123123' # ну или использовать url_for
end

render :json => response
end

В js файле пишем:

$(".delete").bind("click", function(){ // при клике на ссылке
удаления новости
if (confirm('Are you sure?')) {
$.ajax({
dataType: "json", // этим параметром определяется, что ответ от
сервера будет получен в json
type: "DELETE", // method: delete
url: $(this).attr('href'),
success: function(msg){
if (msg.status == 'success') { // если response[:status] ==
"success"
alert(msg.message); // Скажет что новость успешно удалена
} else if (msg.status == 'redirect') {
window.location = msg.url; // редиректим на response[:url]
}
}
});
}
return false; // понятно зачем
});


Да кстати, если нужно отдать ответ от сервера в html, то надо
использовать render_to_string:
response[:html] = render_to_string(:controller => "news", :action =>
"show")

а потом работать уже с response.html

Akzhan Abdulin

unread,
Sep 24, 2009, 7:10:35 PM9/24/09
to ror...@googlegroups.com
Гора переменных для вьюхи... напрашивается хелпер.

22 сентября 2009 г. 13:23 пользователь Quaternion <PainKille...@yandex.ru> написал:

Quaternion

unread,
Sep 25, 2009, 12:40:43 AM9/25/09
to RubyOnRails to russian
Да, с json хорошее решение.
Reply all
Reply to author
Forward
0 new messages