0

我正在尝试等待:真正的选项来处理 collection.create(model) 并且没有任何运气。

要在添加时呈现的视图

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

在导轨控制器中:

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)

没有被触发或者 Rails 没有返回成功......我真的不知道。

任何人都可以帮忙吗?

先感谢您


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

嗯...经过长时间的搜索,终于发布了这个问题......我发现了处理这个问题的方法。我找到了这篇文章/博客

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

基本上我的 create :action 需要是

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

那么我是否可以相信等待什么也没做?还是我只是用错了?我不知道,但这是有效的,我很高兴。需要做更多的重构,但这是一个很好的起点

希望这对其他人也有帮助

4

1 回答 1

1

{wait:true}肯定会有所作为!:-)

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

因此,使用的重要组件wait:true是确保您的服务器响应包含正确的 HTTP 状态。如果是 OKAY,则返回 200 状态,如果不是,则返回 400 或 500 之类的状态。挑一个。我不太确定您的代码是否执行此操作,尽管需要检查。

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

默认情况下(当前)Backbone 是乐观的,这意味着如果你什么都不传递(或wait:false)Backbone 假设一切都会顺利进行。因此,它会在从您的服务器获得响应之前触发您的添加或销毁事件。

于 2012-08-17T18:30:09.903 回答