Backbone网址到Rails路由

时间:2013-09-19 19:50:34

标签: ruby-on-rails backbone.js ruby-on-rails-3.2 routes

我有一个包含task_listproject模型的Backbone on Rails应用。任务列表有一个project_id列,引用它所属的项目。

在Rails中,我设置任务列表的路由如下:

POST    /projects/:project_id/task_lists   task_lists#create  
PUT     /task_lists/:id(.:format)          task_lists#update  
DELETE  /task_lists/:id(.:format)          task_lists#destroy

创建任务列表后,我在Backbone中所做的是实例化任务列表,在Rails中设置task_lists#create路由的URL,然后将其保存到服务器:

taskList = new App.Models.TaskLists(data);  
taskList.url = "/projects/" + current_project_id + "/task_lists";  
taskList.save();

当我需要更新或删除任务列表时,我也会这样做,只是将网址设置为"task_lists/" + this.id

如何在Backbone中设置models/taskList.js文件,而不必在每次需要CRUD任务列表时指定URL?我知道我必须使用自定义函数url: function () {...},但在将数据传递回Rails服务器时,Backbone似乎使用model.url而不是model.url()

2 个答案:

答案 0 :(得分:0)

您可以在初始化集合时传递ID,作为"选项的一部分"对象(第二个参数。

第一个参数是模型,在下面的示例中为空(如[]中所示)。

当对象" c"如果已创建,则立即调用initialize方法,您可以使用如下所示的选项执行操作:

var MyCollection = Backbone.Collection.extend({
    initialize: function(models, options) {
        this.current_project_id = options.current_project_id;
    },
    url: function() {
        return "/projects/" + this.current_project_id + "/task_lists"; 
    }
});

var c = new MyCollection([  ], { current_project_id: 2 } );

请参阅jsfiddle

答案 1 :(得分:0)

Model.url()是一个函数http://backbonejs.org/docs/backbone.html#section-65,因此请从@redconservatory回答:

initialize: function(attrs, options){
    // pass in the actual project model instead
    this.project = options.project;
},
url: function () {
    // keep the backbone default stuffs so specifying urlRoot will still work
    var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError();
    // you only need project url when the object is new so this is enough
    if (this.isNew()) return project.url + base;
    return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id);
}