我正在使用rails api开发一个backbone.js应用程序,它提供了如下所示的json: [{ "title": "Da vinci Code", "price": "50" }, { "title": "Some other name", "price": "45" }], 去做: 当用户访问网址“www.backboneapp.c
[{
"title": "Da vinci Code",
"price": "50"
},
{
"title": "Some other name",
"price": "45"
}],
去做:
>当用户访问网址“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侧-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);
}
AvailableBookList Collection:
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错误.
在console.log中显示:
获取:www.backboneapp.com/authors/undefined
在Rails日志中:参数{id =>未定义}
*我哪里错了? *
任何帮助和建议都非常感谢
我将假设您并不是指路由器中的新AuthorList,而是新的AvailableBookList.您的收藏中有两个问题:
>在您的网址定义中,这指的是窗口对象.
>您在构造函数中传递的id参数未应用于您的集合实例.它仅适用于视图(不适用于模型或集合).
要解决第一个问题,您可以使用函数来定义集合URL,这将使您进入正确的范围:
AvailableBookList = Backbone.Collection.extend({
model: AvailableBook,
url: function() {
return "/authors/" + this.id;
}
});
对于第二个,您可以定义一个初始化函数并在其中设置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 source,构造函数签名是模型,选项:
window.available_books = new AvailableBookList(null, {
id: id
});
