магистральная реляционная проверка связанного поля

Я использую реляционную основу с django deliciouspie, и у меня проблема с отношениями проверки.

Скажем, у меня есть базовая модель с методом проверки:

MyModel = Backbone.RelationalModel.extend({
   urlRoot : '/api/v1/SampleModel/',
   relations : [
   {
      type: Backbone.HasOne,
      key: 'box',
      relatedModel: 'BoxModel',
      includeInJSON: 'id'
   }],

   validate : function(attr)
   {
      if(!attr.name)
      {
         console.log('attr name validation fail');
         return "C mon! name is srsly required!"; 
      }
      if(!attr.box)
      {
        console.log('attr box validation fail');
        console.log(attr.box);
        return "Damn! you forgot to set box!";
      }
   }
});

В некотором представлении я создаю новый экземпляр MyModel с box в качестве resource_uri другого объекта:

var BoxUri = '/api/v1/Box/3'
var NewModel = new MyModel();
NewModel.set('box',BoxUri);
NewModel.set('name','new name for model');

и вот заслуга ... когда я делаю save на модели, всегда происходит сбой при проверке attr.box, а attr.box - это None-, даже если все поля установлены правильно.

Что интересно, если в функции validate сделать что-то вроде:

validate : function(attr){ 
   if(!attr.name)
       {
          console.log('attr name validation fail');
          return "C mon! name is srsly required!"; 
       }
   console.log(attr.box);

}

В приведенном выше случае attr.box отображается в консоли как желаемый объект.

Конечно, если я удалю метод проверки, объект будет сохранен правильно, с соответствующим отношением и т. д.

Как я отметил в документации, по умолчанию валидация запускается только при вызове save(), поэтому все поля уже установлены.. так как (и почему) функция validation знает, что attr.box пусто?

А может мой подход просто неверен?

Спасибо за любую подсказку.


person ASmith78    schedule 17.02.2014    source источник
comment
Когда вы проверяете if(!attr.box), что выводит на консоль console.log(attr.box);   -  person Rida BENHAMMANE    schedule 18.02.2014
comment
Если я сделаю if(!attr.box), console.log вернет null. Но если я console.log(attr.box) без проверки условия, я получу в консоли весь объект.   -  person ASmith78    schedule 18.02.2014
comment
Попробуйте console.log(attr.box); до и после if(!attr.box) посмотреть, что получится.   -  person Rida BENHAMMANE    schedule 18.02.2014
comment
Я получил 3x null: 1 null перед условием, 1 null внутри условия, 1 null после условия, я думаю, даже если он содержит значение, все console.log будут показывать одно и то же значение - в консоли вы всегда будете видеть самую последнюю версию объект.   -  person ASmith78    schedule 18.02.2014
comment
Значит, это не имеет ничего общего с if(!attr.box)? Возможно, ваша проблема в другом.   -  person Rida BENHAMMANE    schedule 18.02.2014
comment
Я думаю, в этом что-то есть, потому что, если я не проверяю модель, она работает нормально. Если я не проверяю условие if(!attr.box), просто отображаю его в консоли, оно отображается правильно. Только если добавить проверку !attr.box - не получится. Похоже, что условие проверяется до того, как attr.box был. Я знаю, это странно, но похоже на это. что интересно, когда я показываю attr.box, я получаю целый связанный объект, а не только resource_uri, который я устанавливаю в поле зрения.   -  person ASmith78    schedule 18.02.2014
comment
давайте продолжим это обсуждение в чате   -  person ASmith78    schedule 18.02.2014
comment
Я думаю, что если в отношениях я определяю отношение как указанную модель, в процессе проверки основа ожидает всю модель, а не только resource_uri. Для deliciouspie достаточно resource_uri, чтобы установить отношение. Вопрос в том, как изменить поведение магистрали при валидации?   -  person ASmith78    schedule 19.02.2014


Ответы (2)


Вы устанавливаете значения в неправильном объекте:

var BoxUri = '/api/v1/Box/3'
var NewModel = new MyModel();
NewModel.set('box',BoxUri); // NewModel instead of MyModel
NewModel.set('name','new name for model'); // NewModel instead of MyModel

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

Кстати, поменяй relatedModel: 'BoxModel', на relatedModel: BoxModel,

person Rida BENHAMMANE    schedule 17.02.2014
comment
Что ж, вы правы, но, к сожалению, это была опечатка только в моем примере кода. Проблема все еще существует. - person ASmith78; 18.02.2014

Наверное, я нашел решение.

модификация в определении модели:

MyModel = Backbone.RelationalModel.extend({
   idAttribute : 'id', //here i added declaration of id field
   urlRoot : '/api/v1/SampleModel/',
   relations : [
   {
      type: Backbone.HasOne,
      key: 'box',
      relatedModel: 'BoxModel',
      includeInJSON: 'resource_uri' // changed 'id' to 'resource_uri' probably it's not required at all
   }],

   validate : function(attr)
   {
      if(!attr.name)
      {
         console.log('attr name validation fail');
         return "C mon! name is srsly required!"; 
      }
      if(!attr.box)
      {
        console.log('attr box validation fail');
        console.log(attr.box);
        return "Damn! you forgot to set box!";
      }
   }
});

в представлении я установил в модели только идентификатор вместо resource_uri:

var BoxUri = '3'
var NewModel = new MyModel();
NewModel.set('box',BoxUri);
NewModel.set('name','new name for model');

после этих двух модификаций валидация заработала.

person ASmith78    schedule 19.02.2014