Обработка ошибок с помощью Ajax в Rails 3 - PullRequest
15 голосов
/ 15 марта 2011

Я создаю простое демонстрационное приложение, которое позволяет пользователю вводить свой адрес электронной почты, чтобы зарегистрировать свою заинтересованность в получении бета-доступа. Затем приложение отправляет им подтверждение по электронной почте, которое сообщает им, что мы получили их запрос. Если вы когда-либо подписывались на уведомление о запуске бета-версии, вы получите идею.

Мне интересно, как обрабатывать ошибки в 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, как мне обрабатывать ошибки, не повторяя себя, или это невозможно. Я, очевидно, хочу сохранить это как можно более сухим.

Ответы [ 3 ]

16 голосов
/ 15 марта 2011

Вы можете по-прежнему отображать общую частичку для всех ошибок .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 %>

Но есть и ДРУГОЙ вариант ... Это даже СУШКА.

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 голосов
/ 22 марта 2013

Я столкнулся с той же проблемой несколько дней назад. Я использовал опцию remote => true в своей форме, чтобы использовать Ajax в моем приложении Rails 3. После этого я искал решение для проверки моих полей формы. Попробовав большое количество подходов jQuery / Javascript (хотя ни один из них не работал для меня), я узнал о превосходном драгоценном камне под названием client_side_validations. Его очень легко установить, следуя инструкциям по ссылке на github (https://github.com/bcardarella/client_side_validations).. Это работает как прелесть для проверки полей формы на стороне клиента, действительно потрясающая жемчужина. Надеюсь, это поможет людям, которые устали искать простой решение для проверки на стороне клиента полей модели после использования Ajax в приложении Rails 3.

2 голосов
/ 13 июня 2011

Я не уверен, что это можно сделать с помощью rails remote, но мой стандартный режим работы - возвращать объекты по запросу ajax в следующем формате:

{ success: true|false,
  data: "html or some other data",
  errors: {} } // jsonified ActiveModel::Errors object

Он работает очень хорошо и позволяет вамвывести части в поле данных для использования на странице, или вы можете просмотреть ошибки в объекте ошибки, чтобы вставить сообщения об ошибках или выделить поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...