2016-03-24 5 views
1

У меня есть приложение для ember с рельсами.Запрос на повторный запрос от данных Ember

У меня есть конкретная ошибка, которую Rails может вернуть (401), что я хотел бы, чтобы Ember поймал и действовал. В этом случае я хотел бы выполнить пользовательский метод (который существенно изменяет файл cookie запроса), а затем снова делает запрос.

Прямо сейчас я ломаю эту ошибку на маршрутизаторе верхнего уровня и заставляю все приложение перезагрузить с помощью window.location.reload(). Очевидно, это ужасный взлом. Мне не удалось заставить router.refresh() работать, но это все равно будет хак.

В идеале я бы поймал это гораздо ближе к адаптеру, чтобы я мог действовать на нем. Возможно, я мог бы поймать это вместо этого на уровне адаптера, переопределив handleResponse(), но как я могу отложить запрос оттуда?

http://emberjs.com/api/data/classes/DS.RESTAdapter.html#method_handleResponse handleResponse действительно проходит вдоль requestData, но мне нужен какой-то способ выполнить запрос в контексте методов адаптера, правильно?

+0

Я полагаю, что ваш сервер возвращает 401, когда пользователь не настроен на произвольный запрос, я прав? Если да, расскажите, как вы справляетесь с авторизацией: используете ли вы ember-simple-auth или что-то еще? –

+0

Я закатил свое собственное решение auth. Я храню некоторые метаданные пользователя в локальном хранилище. Кроме того, Rails поддерживает сеанс. Эта проблема возникает, когда сеанс рельсов истек, а локального хранилища нет. Этот дизайн определенно не является лучшим решением (я думаю, что в конечном итоге я удалю часть локального хранилища), но вот как это работает сейчас. – Jono

ответ

0

Ну, вы можете справиться с этой ошибки в маршруте приложения (что я и сделал):

error: function (error, transition) { 
/** 
    * Code below may vary depending on your server's response format 
    */ 
    if (error.errors !== undefined) { 
    for (var i = 0; i < error.errors.length; i++) { 
     if (error.errors[i].status !== undefined) { 
     if (parseInt(error.errors[i].status) === 401) { 
      transition.abort(); //this line may not be needed in last versions, I'm not sure 
      //Do what should be done, redirect to authentication for example 
      //transition.retry(); should work too 
      break; 
     } 
     } 
    } 
    } 
} 

Это может выглядеть как «слишком высокий уровень», но это, как вы обрабатывать ошибки в уголек. Некоторое время назад я написал post об обработке ошибок, вы можете взглянуть, если вы заинтересованы. Конечно, вы можете расширить адаптер для обработки ошибок, но я бы не предложил сделать это. Во-первых, у вас не будет доступа к методам маршрута/контроллера внутри адаптера. Во-вторых, это не «естественный путь». Адаптер должен вернуть обещание, которое будет отклонено в случае ошибки и не должно обрабатывать ошибки каким-либо другим способом.

+0

Действительно хороший блог. –

+0

@kristjanreinhold спасибо –

+0

http://dpaste.com/19PTY4N Ваш код можно также написать так. Более утонченный путь. –

0

Если модель крючок точки маршрута получить отклонил это взывает метод ошибки

Вы могли бы сделать подмешать и обернуть его свои маршруты.

import RouteMixin from 'xx/mixins/route'; 

Ember.Route.extend(RouteMixin, { 

}) 

А внутри RouteMixin добавить действие

error: function() {   
    // this.transitionTo('/not-found'); 
} 

Аргументы ошибки.

  • Sever ответ
  • класса Transition
  • маршрут, связанная Информация

Вы можете изменить запрос Params и сделать повторный маршрут.

+0

Да, это именно то, что я делаю сейчас. Но его слишком высокий уровень. Я пытаюсь обрабатывать это более прозрачно в слое данных, а не перезагружать страницы. Это существенно нарушает одностраничное приложение и все мои модульные тесты. – Jono

Смежные вопросы