То, что считается Rails Way для Ajax Forms
До сегодняшнего дня я думал, что я использую формы Rails + jQuery UJS был правильным способом сделать это, но обновление до jQuery 1.7 «сломало» путьЯ делал это до сих пор.
Как это сделать?
Я хочу использовать Ajax с моими формами.Ответ ajax должен либо снова отобразить форму (например, при возникновении ошибок), либо перенаправить на страницу успеха.(Возможно, он должен делать больше, например, показ мод, но я хочу, чтобы этот пример был простым).
1.Использование EJS и $ ('# formid'). Html (...)
Это то, что я делал до настоящего времени.Мой ajax-ответ был шаблоном ejs, который возвращал код javascript для повторного отображения формы (с ошибками) или в зависимости от того, была ли ошибка, перенаправил пользователя на страницу успеха:
<% unless @success_submit %>
$('#form_wrapper').html('<%= escape_javacsript( render :partial => 'form' ) %>');
<% else %>
document.location = '/success_thank_you';
<% endif %>
Теперь представьте, что форма содержит ошибкусообщение типа div
<div class="error_message">BlaBla</div>
Чтобы добавить приятный эффект, у меня было завершено общее событие jQuery.live, связанное с завершением ajax, которое выделило ошибки.
$('form').live('ajax:complete', function() {
// do stuff like highlighting all error messages in that form
});
Это не работает с jQuery1.7+ jquery-ujs больше (вероятно, по уважительным причинам).Так что, думаю, то, как я это сделал, было неправильно.
2.Используя вышеприведенный способ, но повторяю себя
Вместо того, чтобы связывать событие ajax: complete, я мог бы делать "вещи с подсветкой ошибок" в EJS, например
$('#form_wrapper').html('<%= escape_javascript( render :partial => 'form' ) %>');
$('#form_wrapper form .error_message').fadeIn();
Но это означало бы, что мне придетсяПовторите вторую строку почти в каждом EJS, который отображает формы.И, конечно же, я хочу сохранить это СУХОЙ.
3.Ajax-ответ отображает чистый html, ajax: complete обрабатывает события display
Совершенно другое решение состоит в том, что ajax-ответ просто отображает чистый html, а мой пользовательский обработчик ajax: complete позаботится об отображении формы.Обработчик будет выглядеть так:
$('form').live('ajax:success', function(ev, data, status, xhr) {
$(this).html(data);
// and e.g. highlight stuff
$(this).children('.error_message').fadeIn();
});
Это будет работать.Но теперь, что мне делать, если мой сервер решит не визуализировать форму снова (например, после успешной регистрации), а вместо этого перенаправить на другой URL или показать модальную форму.Сервер может ответить примерно так:
<script>
document.location = '/success.blabla/';
</script>
Но разве это хорошее решение?
4.Пользовательский протокол JSON
Вероятно, хорошим решением было бы использовать версию 3, но вместо простой замены текущей формы возвращаемым html, мы могли бы создать некоторый пользовательский протокол json.Таким образом, мы могли бы даже позволить серверу отвечать такими вещами, как
- первый модальный показ (например, «Успешная регистрация»)
- перенаправление на страницу входа
Обработчик ajax: success может проверить, является ли ответ чистым html, в этом случае он заменит текущую форму html-кодом.Но если ответ представляет собой массив JSON, он будет обрабатывать это, например, сервер отвечает с
{ html: '<%= render :partial => 'something' %>',
show_modal: '<%= render :partial => 'modal_template' %>',
redirect_after_modal: '/login_page'
}
Обработчик ajax: success будет обрабатывать его как
$('form').live('ajax:success', function(ev, data, status, xhr) {
// try parsing json
if (data.json['show_modal') { // show modal code.... };
if (data.json['redirect']) { document.location=data.json['redirect']);...
});
Как вы это делаетевещи
Очевидно, что есть много способов обработки форм Ajax.Но как ты это делаешь, и что считается наилучшей практикой с Rails?