Ember SimpleAuth авторизован на itemController

В моем приложении мне нужно, чтобы пользователям был предоставлен доступ к организациям в соответствии с отношением «многие ко многим», например:

App.User = DS.Model.extend({
  fullname: DS.attr('string'),
  password: DS.attr('string'),
  administrator: DS.attr('boolean'),
  organisation_users: DS.hasMany('organisation_user', {async: true})
});

App.OrganisationUser = DS.Model.extend({
  organisation: DS.belongsTo('organisation', {async: true}),
  user: DS.belongsTo('user', {async: true}),
  administrator: DS.attr('boolean')
});

App.Organisation = DS.Model.extend({
  fullname: DS.attr('string', {defaultValue: 'Unnamed University'}),
  description: DS.attr('string'),
  organisation_users: DS.hasMany('organisation_user', {asynch: false}),
});

Я использую Ember SimpleAuth для аутентификации. Итак, основываясь на этом ответе на предыдущий вопрос, я реализовал isAuthorised в моем OrganisationController следующим образом:

App.OrganisationController = Ember.Controller.extend({

  //Determine whether the logged in user is authorised
  isAuthorised: function() {
    if(!this.get('session.isAuthenticated')) {
      console.log("Not logged in...");
      return false;
    }

    console.log("Does user [" + this.get('session.user.id') + "] have access to organisation [" + this.get('model.id') + "]?");
    if(this.get('session.user.administrator')) {
      console.log("Yes, because they are an administrator.");
      return true;
    } else {
      console.log("Well, they are not an administrator so...");
    }
    console.log("We need to check " + this.get('model.fullname') + " for authorised users.");
    this.get('model.organisation_users').forEach(function(org_user){
      org_user.get('user').then(function(user) {
        console.log(user.get('fullname') + " has access");
      });
    });
  }.property('model', 'session.user'),

Проблема в том, что я не знаю, как вернуть значение из этого. Кроме того, когда я загружаю OrganisationRoute, кажется, что он работает нормально, но когда я загружаю другой маршрут и перехожу на этот маршрут, он терпит неудачу с

Uncaught TypeError: Cannot read property 'resolve' of undefined

а также

Uncaught Error: Something you did caused a view to re-render after it rendered but before it was inserted into the DOM.


person Graeme Stuart    schedule 07.08.2014    source источник
comment
Можете ли вы показать, как вы выполняете загрузку (api json, маршруты, инициализация и т. д.)? Похоже, что org_user.get('user') возвращается как пустое свойство, а внутренности .then блеют. Просто предположение. Попробуйте прокомментировать это и посмотреть, все ли еще взрывается.   -  person Matthew Blancarte    schedule 07.08.2014


Ответы (1)


Я думаю, что ваша ошибка связана с этим фрагментом кода (я думаю, у вас есть некоторые проблемы с боковой загрузкой):

this.get('model.organisation_users').forEach(function(org_user){
  org_user.get('user').then(function(user) { // org_user hasn't loaded its user record?
    console.log(user.get('fullname') + " has access");
  });
});

Я бы, наверное, пошел по такому шаблону:

return this.get('organisation_users').any(function (item) {
  return item.get('user.id') === this.get('session.user.id');
});

.any будет перечислять до тех пор, пока обратный вызов не вернет true. Если true, внешняя область вернет true, чего вы и хотите.

Если ничего не совпадает, вы получаете ложь. Довольно просто.

Другая часть этой головоломки — это боковая загрузка, как я упоминал ранее в ответе.

person Matthew Blancarte    schedule 07.08.2014
comment
Первый get('organisation_users') не работает Uncaught TypeError: Cannot read property 'any' of undefined. Поэтому я изменил его на get('model.organisation_users), и он работает нормально. Является ли это симптомом проблемы? - person Graeme Stuart; 08.08.2014
comment
@GraemeStuart Попробуйте обновить Ember.Controller до Ember.ObjectController. - person Matthew Blancarte; 08.08.2014