应该Backbone收集'创建'将新模型添加到包含服务器ID的集合中?

时间:2016-05-05 03:49:07

标签: ruby-on-rails backbone.js handlebars.js fetch

在我的Backbone视图中,我希望能够立即将我的模型添加到我的集合中,并在新创建的模型中包含'id'属性。换句话说,我需要立即访问此'id'。在id可用的情况下,我的removeCategory方法可以正常运行。要解决问题&#34;这个问题,我尝试在this.collection.fetch()下面添加一行this.collection.add(model);,但它给了我非常糟糕的用户界面(新的<li>甚至不会渲染等等),加上它无论如何,这似乎是非常糟糕的编码练习。

我对Backbone相对比较新,所以我不确定create(保存/添加)是否应该自动将模型添加到带有id的集合中。如果它应该,那么我从Rails RESTful API接收的JSON数据肯定有问题。如果create没有这样做,那么我怎样才能立即访问这个特定的新创建的模型,使用id(除了刷新浏览器 - 呃!)?我一调用&#34; addCategory&#34;我就在我的Handlebars模板中需要id <li data-id={{id}}></li> model.fetch();方法

另外(&amp;这可能是一个相关的问题),当我做id时,我会回到模型的整个集合,再加上新创建的服务器端模型没有{{1} }}。对此有任何帮助将非常感激。

window.CategoriesView = Backbone.View.extend({

  index_template: HandlebarsTemplates['categories/index'],

  events: {
    'click .delete': 'removeCategory',
    'click .category_add': 'addCategory'
  },
  initialize: function() {
    _.bindAll(this, 'render');
    this.collection.fetch();
    this.listenTo(this.collection, 'all', this.render);
  },

  show: function() {
    $("#categorymodal").modal();
  },

  addCategory: function(e) {
    e.preventDefault();
    // I wrote the next three lines here explicitly rather than using 'create'
    var model = new Category({ name: $(this.el).find('.category_name').val() });
    model.save();
    this.collection.add(model);
    this.show();
  },

  removeCategory: function(e) {
    e.preventDefault();
    var id = $(e.target).parents('li').data('id');
    var model = this.collection.where({ id: id })[0];
    this.collection.remove(model);
    if (model) { model.destroy(); }
    this.render();
  },

  render: function() {
    $(this.el).html(this.index_template());

    this.collection.models.forEach(function(cat) {
      var li_template = HandlebarsTemplates['categories/show']
      $(this.el).find('.categories').append(li_template({
        id: cat.toJSON().id,
        name: cat.toJSON().name
      }));
    }, this);

    return this;
  }

});

以下是我在Rails中的#create操作....

def create
  @category = Category.create(category_params)
  render :nothing => true
end

我正在使用jbuilder来提供Rails API中的JSON。

这是我的Backbone模型和集合......

window.Category = Backbone.Model.extend({

  urlRoot: "categories"

});


window.Categories = Backbone.Collection.extend({

  model: Category,
  url : function() {
    return 'categories';
  }

});

1 个答案:

答案 0 :(得分:1)

我发现了我的问题。它在我的Rails控制器中,而不是Backbone create。我改变了#create行动......

def create
  @category = Category.create(category_params)
  render :nothing => true
end

......对此......

def create
  @category = Category.create(category_params)
  redirect_to category_path(@category)
end

......我的表演行动就是这个......

def show
  @category = Category.find(params[:id])
end

......这为我提供了http://localhost:3000/categories/752.json。我必须确保我的后端提供我需要JSON的东西!