骨干和rails collection.create等

时间:2012-08-17 15:13:15

标签: javascript ruby-on-rails-3.1 backbone.js

我正在尝试使用wait:true选项来处理collection.create(模型)并且没有任何运气。

要在添加

上呈现的视图
window.ObjectsView = GreyboxView.extend
  initialize: function() {
    _.bindAll(this, 'render');
    this.collection.bind('add', this.render);
    return this.collection.bind('reset', this.render);
  },
  render: function() {
    json = { obj removed }
    this.template = _.template(JST['irboards/index'](json));
    this.$el.html(this.template());
    this.renderObjects();
    return this;
  }
}

关于模型保存(新)

window.FormView = GreyboxView.extend({
  // un-needed code omitted
  saveModel: function() {
    this.model.set { all my attributes }

    this.collection.create(this.model, {
      wait: true
    });
  }
}
在rails controller中

def create
  @model = Model.new(params[:model].merge({:account_id => current_user.account.id, :action_user_id => current_user.id}))

  if @model.save
    flash[:success] = AppSystem::Notifications.created('Model')
    respond_with @model.to_json
  else
    flash[:error] = @model.errors[:base].blank? ? AppSystem::Notifications::FORM_ERROR :   @model.errors[:base]
    render :action => :new
  end
end

基本上{wait:true}什么都不做......要么没有将js模型添加到集合中,要么b / c保存到数据库或

this.collection.bind('add', this.render)

没有被触发或者轨道没有恢复成功......我真的不知道。

有人可以帮忙吗?

提前谢谢


显然我还不能回答我自己的问题,但我不想忘记这个b / c我知道它会帮助别人。这样:

嗯......经过很长一段时间的搜索,最后发布了这个问题......我发现了解决这个问题的方法。我找到了这篇文章/博客

http://italktoomuch.com/2012/05/setting-up-backbonejs-with-ruby-on-rails/

基本上我的创建:动作需要

def create
  respond_with = Model.create(params0
end

和js是:

this.collection.create(attributes, {
  wait: false,
  success: function() {
    return _this.collection.trigger('reset');
  },
  error: function() {
    return alert('wrong!');
  }
})

所以我离开了相信等待什么都没做?或者我只是错误使用它?我不知道,但这很有效,我很高兴。需要做一些重构,但这是一个开始的好地方

希望这也有助于其他人

1 个答案:

答案 0 :(得分:1)

{wait:true}当然有所作为! : - )

我对rails一无所知,但我认为这可能是问题所在。基本上,当您通过选项wait:true时,主干将在创建或销毁模型之前等待服务器响应,从而仅在验证资源已保存或删除后才在集合中添加或删除它。

因此,使用wait:true的重要组成部分是确保您的服务器响应包含正确的HTTP状态。如果OKAY和400之类的话,返回200的状态,如果不是,则返回500。挑选一下。我不太确定你的代码是否这样做,尽管这是要检查的东西。

进一步注意,似乎您在代码中添加了成功和错误回调。基本上这也是Backbone知道是否调用成功或错误的方式。 200,它执行成功。其他任何东西都会运行错误。

默认情况下(当前)Backbone是乐观的,这意味着如果你没有传递任何东西(或wait:false),Backbone会认为一切都会好起来的。因此,在从服务器获得响应之前,它会触发您添加或销毁事件。