2013-08-29 2 views
3

Я разрабатываю RESTful API для приложения Quiz, который будет построен с Backbone.js и Marionette. Я совершенно новичок в магистрали, и мне было интересно, какая будет лучшая структура URL. У меня есть следующие ресурсы:Оптимальная структура URL для реализации Backbone.js и Backbone

  • ответ,
  • Вопрос, который содержит ответы,
  • Вопрос группы, которая содержит вопросы,
  • Викторины, который содержит Вопросительные группы.

Два возможных структур URL приходят на ум:

  • GET /quizzes/:id
  • GET /quizzes/:id/questiongroups
  • GET /quizzes/:id/questiongroups/:id
  • GET /quizzes/:id/questiongroups/:id/questions
  • GET /quizzes/:id/questiongroups/:id/questions/:id
  • GET /quizzes/:id/questiongroups/:id/questions/:id/answers

или:

  • GET /quizzes/:id
  • GET /quizzes/:id/questiongroups
  • GET /questiongroups/:id
  • GET /questiongroups/:id/questions
  • ...

Теперь я пытаюсь использовать оба этих параметра. С первым я не могу понять, как определить коллекции как свойство родительских моделей в Backbone, чтобы я мог использовать fetch() на них. Проблема со вторым вариантом немного отличается: как я понимаю, Backbone выводит url для модели из своей коллекции, но коллекция является дочерним элементом другого ресурса, тогда как URL-адрес для получения одного ресурса использует другую коллекцию, а именно глобальный набор ресурсов.

Я уверен, что мне придется переопределить url() в обоих случаях. Я пробовал кое-что, но не придумал ничего полезного. Кроме того, я бы предпочел не переопределить каждый модем url() в приложении, изменив структуру API в соответствии с предпочтениями Backbone, кажется лучшим вариантом для меня.

Все указатели, как к тому, что, кажется, правильный способ сделать это с Backbone было бы здорово!

Благодаря

ответ

0

Если questiongroup s может появиться только в одном quiz, то первый вариант (иерархическая один) является очевидным выбором. Чтобы соответствовать соглашениям RESTful, вы можете вместо этого использовать вместо них сингулярные существительные: /quiz/:id/questiongroups/:id/question/:id/answer/:id

Чтобы решить проблему, я бы рекомендовал использовать вложенные модели магистралей в соответствии с этим ответом: https://stackoverflow.com/a/9904874/1941552. Я также добавил нахальный маленький атрибут parentModel.

Например, ваш QuizModel может выглядеть примерно так:

var Quiz = Backbone.Model.extend({ 

    urlRoot: '/quiz/', // backbone appends the id automatically :) 

    defaults: { 
     title: 'My Quiz' 
     description: 'A quiz containing some question groups.' 
    }, 

    model: { 
     questionGroups: QuestionGroups, 
    }, 

    parse: function(response){ 
     for(var key in this.model){ 
      var embeddedClass = this.model[key]; 
      var embeddedData = response[key]; 
      response[key] = new embeddedClass(embeddedData, { 
       parse:true, 
       parentModel:this 
      }); 
     } 
     return response; 
    } 
}); 

Тогда ваша QuestionGroups модель может иметь следующие функции: url()

var QuestionGroups = Backbone.Model.extend({ 

    // store metadata and each individual question group 

    url: function() { 
     return this.parentModel.url()+'/questiongroup/'+this.id; 
    } 

}); 

В качестве альтернативы, если вам не нужно хранить любые метаданные, вы можете использовать Backbone.Collection:

var QuestionGroups = Backbone.Collection.extend({ 

    model: QuestionGroup, 

    url: function() { 
     return this.parentModel.url()+'/questiongroup/'+this.id; 
    } 

}); 

Боюсь, что я ничего не испытал, но надеюсь, что это может быть полезно в любом случае!

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