Обработка ошибок с помощью Ajax в Rails 3
Я создаю простое демонстрационное приложение, которое позволяет пользователю вводить свой адрес электронной почты, чтобы зарегистрировать свою заинтересованность в получении бета-доступа. Затем приложение отправляет им электронное письмо с подтверждением, которое позволяет им узнать, что мы получили их запрос. Если вы когда-либо подписались на получение бета-версии, вы получите эту идею.
Мне интересно, как обрабатывать ошибки в Rails 3 при использовании AJAX. Перед реализацией моего блока response_to у меня была форма, которая частично разделяла частичные ошибки.
Здесь форма.
<% if flash[:notice] %>
<p><%= flash[:notice] %></p>
<% end %>
<p>Sign up to be notified when the beta launches.</p>
<%= form_for @user, :remote => true do |form| %>
<%= render '/shared/errors', :target => @user %>
<%= form.label :email, "Your Email Address" %>
<%= form.text_field :email %>
<%= form.submit "Notify Me" %>
<% end %>
И здесь вышеупомянутые ошибки являются частичными.
<% if target.errors.any? %>
<ul>
<% target.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
<% end %>
Очень стандартный материал. Действие контроллера выглядит следующим образом.
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
format.html { redirect_to :back, flash[:notice] = "Thanks for your interest! We'll let you know when the app is in beta." }
format.js
else
format.html { render :action => :new }
format.js
end
end
end
Все работает отлично, прежде чем реализовать ajax. Если форма проходит проверку, то они видят успешное флэш-сообщение, а если нет, то они видят список ошибок. Итак, теперь, когда у меня есть файл create.js.erb, как я должен обрабатывать ошибки, не повторяя себя или это невозможно. Я, очевидно, хочу, чтобы это было как можно сухим.
Ответы
Ответ 1
Вы все же можете отобразить общую часть для всех ошибок .js в файле js.erb.
<% if @user.errors.any? %>
var el = $('#create_user_form');
// Create a list of errors
<%= render :partial=>'js_errors', :locals=>{:target=> @user} %>
<% else %>
$('#users_list').append("<%= escape_javascript(render :partial=>"users/show", :locals=>{:user => @user }) %>");
// Clear form
el.find('input:text,textarea').val('');
el.find('.validation-errors').empty();
<% end %>
И ваш частичный может выглядеть (Предполагая jquery):
<% target.errors.full_messages.each do |error| %>
var errors = $('<ul />');
errors.append('<li><%= escape_javascript( error ) %></li>');
<% end %>
Но есть и еще один вариант... Он даже DRYer.
http://www.alfajango.com/blog/rails-3-remote-links-and-forms/
Если вы прокладываете себе путь через ajax в rails 3, это руководство действительно лучше всего подходит для понимания ответов и рендеринга ajax, поскольку он в настоящее время стоит.
Я работал над этим руководством и размещал в комментариях, как вы можете фактически использовать свои частичные части HTML для ответов на запросы HTML и AJAX. Я сделал это случайно, а затем продолжил, как это сделать.
Наслаждайтесь!
Фактически вы можете возвращать прямое html с ответом, как раньше.
Здесь короткая версия:
def create
@something = Somethng.new(params[:something])
if @something.save
respond_with( @something, :status => :created, :location => @something ) do |format|
format.html do
if request.xhr?
render :partial => "something/show", :locals => { :billable => @billable }, :layout => false
end
end
end
else
respond_with( @something.errors, :status => :unprocessable_entity ) do |format|
format.html do
if request.xhr?
render :partial => "something/new", :locals => { :something => @something }, :layout => false
else
render :action => :new
end
end
end
end
end
Ответ 2
Я не уверен, что рельсы удалены, чтобы сделать это, но мой стандартный режим работы - вернуть объекты в запрос ajax в этом формате:
{ success: true|false,
data: "html or some other data",
errors: {} } // jsonified ActiveModel::Errors object
Он работает очень хорошо и позволяет выставлять частичные данные в поле данных для использования на странице, или вы можете зацикливать ошибки в объекте ошибки, чтобы вставлять сообщения об ошибках или выделять поля.
Ответ 3
Я столкнулся с той же проблемой несколько дней назад. Я использовал параметр remote => true
в своей форме для использования Ajax в моем приложении Rails 3. После этого я искал решение для проверки моих полей формы. Попробовав большое количество подходов jQuery/Javascript (ни один из них не работал у меня), я узнал о превосходном драгоценном камне под названием client_side_validations
. Его очень легко установить, следуя инструкциям по ссылке github (https://github.com/bcardarella/client_side_validations). Он работает как прелесть для проверки на стороне клиента полей формы, на самом деле это потрясающий камень. Надеюсь, это поможет людям, которые устали искать простое решение для проверки на стороне клиента полей модели после использования приложения Ajax в Rails 3.