Подтвердить что ты не робот

Поиск парадигмы для использования для общей обработки ошибок в Angular из ответа JSON от Rails

Я создаю приложение, которое является архивированным как приложение сервера Rails, предоставляющее RESTful api клиенту. Сервер Rails использует RABL. Клиент является клиентом Angular JS, выполняющим стандартные $http-вызовы (получает, помещает и т.д.).

Иногда мой Rails-сервер выдает ошибку (допустим, к ошибке проверки прикреплен к объекту) или даже нет ошибки, и в этом случае я хотел бы отобразить что-то пользователю - либо ошибку, например, "Запись не сохранялась, потому что..." или "Запись была успешно обновлена ​​".

Я пытаюсь отобразить шаблон как на стороне Rails, так и на стороне Angular/client, чтобы справиться с этим.

Что касается Rails:

  • Я могу, конечно, передать node в каждом из моих RABL файлов, чтобы содержать массивы ошибок
  • Я также могу вернуть разные RABL, проверив контроллер, прежде чем возвращать
  • Большинство из них предлагает использовать http-коды (что имеет смысл) в соответствии с здесь (хотя, похоже, не существует последовательного использования кодов для чего-то вроде проверки ошибка).

Что касается Angular:

Наверное, я надеюсь, что мне не нужно изобретать колесо здесь, и кто-то может указать мне образец, который в настоящее время используется и предлагается (и локализован).

4b9b3361

Ответ 1

Я пошел вперед и реализовал то, что, как мне казалось, нужно было сделать. Спасибо за digger69 за помощь в этом.

На стороне Rails я пошел с использованием кода состояния http. В соответствии с здесь я согласился с использованием 400 http-кода статуса для проверки правильности.

В моих контроллерах у меня теперь есть что-то вроде следующего:

def create
  my_obj = MyObj.build_with_params(params)
  if my_obj.save
    respond_with(my_obj) # regular RABL response
  else
    respond_with_errors(my_obj.errors)
  end
end

В моем application_controller.rb я определил общий метод response_with_errors

# respond back to the client an http 400 status plus the errors array
def respond_with_errors(errors)
  render :json => {:errors => errors}, :status => :bad_request
end

Обратите внимание, что символ: bad_request уже определен для Rails по здесь

На стороне клиента мне нужно было перехватить http-вызовы (не только для проверки, но и для ошибок аутентификации (и, возможно, больше). Вот пример моего кода в Angular (благодаря этот пост, чтобы помочь с этим):

var interceptor = ['$rootScope', '$q', function (scope, $q) {
  function success(response) {
    return response;
  }
  function error(response) {
    var status = response.status;

    if (status == 401) { // unauthorized - redirect to login again
      window.location = "/";
    } else if (status == 400) { // validation error display errors
      alert(JSON.stringify(response.data.errors)); // here really we need to format this but just showing as alert.
    } else {
      // otherwise reject other status codes
      return $q.reject(response);
    }
  }
  return function (promise) {
    return promise.then(success, error);
  }
}];
$httpProvider.responseInterceptors.push(interceptor);

Теперь я могу быть совместим с моим кодом rails и иметь дело с успешным возвратом из http-вызовов на клиенте. Я уверен, что мне нужно еще кое-что сделать, но я думаю, что это дает локализованное решение.

Ответ 2

Использовать HTTP-перехватчик. В настоящее время я успешно использую это приложение.

http://docs.angularjs.org/api/ng.$http

Из документации:

$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
  return function(promise) {
    return promise.then(function(response) {
      // do something on success
    }, function(response) {
      // do something on error
      if (canRecover(response)) {
        return responseOrNewPromise
      }
      return $q.reject(response);
    });
  }
});

$httpProvider.responseInterceptors.push('myHttpInterceptor');

В моем случае я создал службу обратной связи, которая отображает сообщения об успехе или ошибке глобально. Другой вариант - трансляция ответов на корнеплод.