Backbone.js URL коллекции

#ruby-on-rails-3 #backbone.js

#ruby-on-rails-3 #backbone.js

Вопрос:

Я работаю над backbone.js приложение с rails api, которое предоставляет json, как показано:

    [{
        "title": "Da vinci Code",
        "price": "50"
    },
    {
        "title": "Some other name",
        "price": "45"
    }],
  

TODO:

  1. Когда пользователь посещает URL-адрес «www.backboneapp.com/authors/1 « , он должен отображать список книг, принадлежащих автору.

Прогресс: — Серверная часть-Rails [authorscontroller#show]

 def show
  @author = Author.find(params[:id])
  @books  = @author.books
  respond_to do |format|
    format.json { render :json => @books }
    format.html
  end
end
  

2.Client-side-Backbone.js

Маршрутизатор:

 routes: {
  'authors/:id': 'showauthor'
},

showauthor: function(id) {

  $('#container').empty();
  window.available_books = new AvailableBookList({
    id: id
  });

  this.availablebooklistview = new AvailableBookListView({
    id: id,
    collection:  available_books
  });

  $('#container').append(this.availablebooklistview.render().el);
}
  

Доступная коллекция Booklist:

 AvailableBookList = Backbone.Collection.extend({
  model: AvailableBook,
  url: "/authors/"   this.id  
})
  

Часть просмотра:

 $(document).ready(function(){

AvailableBookListView = Backbone.View.extend({
  tagName:   'section',
  className: 'availablebooklist',

  initialize: function() {
    _.bindAll(this, 'render');
    this.collection.bind('reset', this.render);
  },

  render: function() {
    this.collection.each(function(available_book) {
      var view = new AvailableBookView({
         model: available_book,
      });

      this.$('.availablebooklist').append(view.render().el);
    });
    return this;
  }
});

});
  

Проблема: когда я посещаю «www.backboneapp.com/authors/1 « Я получаю ошибку 404.
В консоли.войдите, чтобы показать:
получаем:www.backboneapp.com/authors /не определено

В журнале Rails: parameters {id => undefined}

*Где я ошибаюсь? *

Любая помощь и предложения высоко ценятся

Ответ №1:

Я собираюсь предположить, что вы имели в виду не new AuthorList в вашем маршрутизаторе, а скорее new AvailableBookList .

У вас две проблемы в вашей коллекции:

  1. В определении вашего URL-адреса он this ссылается на window объект.
  2. id Параметр, который вы передаете в конструкторе, не применяется к экземпляру вашей коллекции. Это работает таким образом только для представлений (не для моделей или коллекций).

Чтобы решить первую проблему, вы можете использовать функцию для определения URL коллекции, которая поместит вас в правильную область видимости:

 AvailableBookList = Backbone.Collection.extend({
  model: AvailableBook,
  url: function() {
    return "/authors/"   this.id;
  }
});
  

Для второго вы можете определить initialize функцию и установить в ней id атрибут:

 AvailableBookList = Backbone.Collection.extend({
  initialize: function(models, options) {
    this.id = options.id;
  },
  model: AvailableBook,
  url: function() {
    return "/authors/"   this.id;
  }
});
  

В целях удобства чтения я бы также предложил переименовать id в author_id :

 AvailableBookList = Backbone.Collection.extend({
  initialize: function(models, options) {
    this.author_id = options.author_id;
  },
  model: AvailableBook,
  url: function() {
    return "/authors/"   this.author_id;
  }
});
  

Обновить

Вы также неправильно инициализируете свою коллекцию. Согласно Backbone.js источник, сигнатура конструктора models, options :

 window.available_books = new AvailableBookList(null, {
  id: id
});
  

Комментарии:

1. В initialize: function(models, options) { this.id = options.id);} я получаю не удается прочитать свойство ‘id’ неопределенного значения, даже решение author_id выдает мне ту же ошибку .. initialize: function(options) { this.id = options.id; } , это работает…. Но я все еще получаю ту же ошибку Не удается прочитать свойство ‘id’ неопределенного

2. Я рад, что это сработало. Также спасибо за последующие действия, они также приветствуются с точки зрения ответчика.