Я не знаю, является ли это лучшей практикой или нет, но я сделал это следующим образом:
В контроллере, если произошла ошибка:
render :new, :status => :bad_request
new.js.erb - это исходное представление, включая форму с ошибками.
JavaScript:
$('#the_form').live('ajax:failure', function(evt, xhr, status, error) {
if (xhr.status == 400) {
alert(xhr.responseText);
} else {
alert('Generic error message');
}
});
Rails отправляет 500 (: internal_server_error) при возникновении исключений. Это покрыто остальным в JavaScript, но, как вы видели, у вас не будет возможности вернуть ошибку или перерисовать форму в этом случае. Мне пришлось использовать другой код состояния, чтобы он отображал содержимое, но все равно попадал в событие ajax: fail.
Вот список отображений кодов состояния . Я выбрал 400, потому что это был самый близкий матч.