Что считается Rails Way для форм Ajax
До сегодняшнего дня я думал, что я использую 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: полное отображение дескрипторов событий
Полное решение будет состоять в том, что ответ ajax просто отобразит чистый html и мой пользовательский ajax: полный обработчик позаботится о отображении формы. Обработчик будет выглядеть как
$('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?