Rails 3 - Отображение ошибок, когда Data-Remote имеет значение True - PullRequest
4 голосов
/ 13 января 2012

У меня есть эта форма

<div id="login">

  <h4>Please log in with your email address</h4>
  <%= form_for(@user, id: "login", remote: true) do |f| %>
    <% if @user.errors.any? %>
      <div id="error_explanation">
        <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>

        <ul>
        <% @user.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
        </ul>
      </div>
    <% end %>

    <div class="field">
      <%= f.label :name %><br />
      <%= f.text_field :name %>
    </div>
    <div class="field">
      <%= f.label :email %><br />
      <%= f.text_field :email %>
    </div>
    <div class="field">
      <%= f.label :company %><br />
      <%= f.text_field :company %>
    </div>
    <div class="field">
      <%= f.label :phone %><br />
      <%= f.text_field :phone %>
    </div>
    <div class="field">
      <%= f.label :address %><br />
      <%= f.text_field :address %>
    </div>
    <div class="actions">
      <%= f.submit id: "signup_submit" %>
    </div>
  <% end %>
  <script>
      $("#signup_submit").bind("ajaxSend", function(){
           alert('start');
         }).bind("ajaxComplete", function(){
           alert('end');
         });
  </script>
</div>

Таким образом, для data-remote установлено значение true, и мне трудно отображать ошибки, которые в противном случае срабатывают при ухудшении до HTTP-запросов.

Я уверен, что это просто, и буду признателен за любую помощь.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 14 января 2012

Сначала реорганизуйте это так, чтобы на странице существовал div error_explanation (чтобы вы могли заполнить его сообщением об ошибке ... при необходимости скройте его с помощью CSS)

<div id="error_explanation">
  <% if @user.errors.any? %>
    <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>

    <ul>
    <% @user.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  <% end %>
</div>

Затем вы можете добавить этот бит кода jQuery в существующую область тега <script>:

// a method for parsing the JSON response
handle_ajax_error = function(response) {
  try { var responseText = jQuery.parseJSON(response.responseText); } catch(e) { var responseText = null; }
  if (responseText !== null) { 
    var responseMsg = responseText.error; 
  } else {
    responseMsg = 'There was an unknown error or the request timed out.  Please try again later';
  }

  return responseMsg;
}

// callback for the ajax error on the #login form
$('#login').live('ajax:error', function(data, xhr, response){ 
  $('#error_explanation').html(handle_ajax_error(response));
});

И тогда это предполагает, что у вас есть что-то вроде этого в вашем контроллере в ответ на ошибку:

def create
  @user = User.create(params[:user])
  if @user.save
    redirect_to user_path(@user)
  else
    render :json => { :error => @user.errors.full_messages.to_sentence }, 
           :status => :unprocessable_entity
  end
end
2 голосов
/ 22 марта 2013

Существует более простое решение этой проблемы с использованием этого гема (https://github.com/bcardarella/client_side_validations). Этот гем довольно легко установить в приложении Rails, и проверка полей форм на стороне клиента становится очень легкой с помощью этого гема.

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