#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:
- Когда пользователь посещает 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
.
У вас две проблемы в вашей коллекции:
- В определении вашего URL-адреса он
this
ссылается наwindow
объект. 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. Я рад, что это сработало. Также спасибо за последующие действия, они также приветствуются с точки зрения ответчика.