【问题标题】:Backbone urls to Rails routesRails 路由的主干 URL
【发布时间】:2013-09-19 19:50:34
【问题描述】:

我有一个 Backbone on Rails 应用程序,其中包含 task_listproject 模型。任务列表有一个 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();

当我需要更新或删除任务列表时,我会执行上述操作,只是将 url 设置为"task_lists/" + this.id

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

【问题讨论】:

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


    【解决方案1】:

    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);
    }
    

    【讨论】:

      【解决方案2】:

      您可以在将集合初始化为“选项”对象(第二个参数)的一部分时传递 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

      【讨论】:

        猜你喜欢
        • 2014-06-07
        • 1970-01-01
        • 1970-01-01
        • 2016-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-17
        • 1970-01-01
        相关资源
        最近更新 更多