Ruby on rails 3 当通过路由器反序列化时,余烬数据检查是否在存储中找到模型

Ruby on rails 3 当通过路由器反序列化时,余烬数据检查是否在存储中找到模型,ruby-on-rails-3,ember.js,ember-data,ember-old-router,Ruby On Rails 3,Ember.js,Ember Data,Ember Old Router,我在路由器中有一个带有connectOutlets的对象路由(使用标准REST后端的ember数据),它只需反序列化和加载对象并将其插入插座 # inside router action: Ember.Route.extend route: 'object/:object_id' connectOutlets: (router, object) -> unless object.get('isLoaded') # What goes here to

我在路由器中有一个带有
connectOutlets
的对象路由(使用标准REST后端的ember数据),它只需反序列化和加载对象并将其插入插座

  # inside router 
  action: Ember.Route.extend
    route: 'object/:object_id'

    connectOutlets: (router, object) ->
      unless object.get('isLoaded') # What goes here to tell if the object wasn't found?
         #
         #  handle this case (e.g., redirect)
         #
      else # otherwise proceed as normal
        router.get('applicationController').connectOutlet('object', object) 
当我导航到不存在的
localhost/#object/object\u
时,路由器反序列化url,尝试加载对象(服务器日志显示不存在的localhost/objects/object\u的HTTP GET请求),获取404,并创建一个id设置为不存在的
object\u的新对象

我想查出这件事并处理此案。现在,我正在检查
isLoaded
属性,它确实区分了现有模型和不存在的模型,但我不确定这是最好的方法


理想情况下,会有一种类似于Rails的方法,
new\u record?

看看源代码:


我还没有尝试过,但是
是新的
可能就是您要寻找的。

看看源代码:


我还没有尝试过,但您可能正在寻找的是
isNew

您不想在connectOutlet中执行此操作,因为它需要应用程序等待,同时检查数据库中的记录

就我个人而言,我会在适配器中使用自定义的
查找
方法,并从那里处理404错误

find: function(store, type, id) {
  var root = this.rootForType(type);

  this.ajax(this.buildURL(root, id), "GET", {
    success: function(json) {
      this.didFindRecord(store, type, json, id);
    },
    statusCode: {
      404: function() {
        # I can never remember the exact semantics, but I think it's something like this
        this.trigger('didNotFindRecord');
      }
    }
  })
}


connectOutlets: (router, object) ->
  router.get('store').addObserver('didNotFindRecord', this, 'handle404')
  router.get('applicationController').connectOutlet('object', object) 

handle404: ->
     # 
     #  handle this case (e.g., redirect)
     #

但是,您必须小心正确地拆除观察程序。

您不希望在connectOutlet中执行此操作,因为它将要求应用程序在检查数据库记录时等待

就我个人而言,我会在适配器中使用自定义的
查找
方法,并从那里处理404错误

find: function(store, type, id) {
  var root = this.rootForType(type);

  this.ajax(this.buildURL(root, id), "GET", {
    success: function(json) {
      this.didFindRecord(store, type, json, id);
    },
    statusCode: {
      404: function() {
        # I can never remember the exact semantics, but I think it's something like this
        this.trigger('didNotFindRecord');
      }
    }
  })
}


connectOutlets: (router, object) ->
  router.get('store').addObserver('didNotFindRecord', this, 'handle404')
  router.get('applicationController').connectOutlet('object', object) 

handle404: ->
     # 
     #  handle this case (e.g., redirect)
     #

不过,您必须小心正确地拆除观察者。

谢谢您的回答——我不认为“等待应用程序检查数据库记录”是在connectOutlets中不这样做的相关异议,因为我使用的是余烬数据,在调用connectOutlets时,应用程序已尝试获取对象(无论对象是否存在于数据库中)。我正在为我的适配器使用ember数据——我假设我不需要在开箱即用的情况下对其进行太多的修补。Sherwin:我认为异步UI应该是任何现代web应用程序的重要组成部分,而等待AJAX调用完成是一个令人难以置信的相关异议。也就是说,如果你只是为了好玩而拼凑一些东西,那就去做吧。至于修补余烬数据,我相信一旦稳定下来,库中将添加更好的处理方法,因此,它只是添加了一些不存在的特性来寻找答案——我不认为“等待应用程序检查数据库中的记录”是在connectOutlets中不这样做的相关异议,因为我使用的是余烬数据,在调用connectOutlets时,应用程序已经尝试获取对象(无论数据库中是否存在)Sherwin:我认为异步UI应该是任何现代web应用程序的一个重要组成部分,而等待AJAX调用完成是一个令人难以置信的相关异议。也就是说,如果你只是为了好玩而拼凑一些东西,那就去吧或者它。至于修补余烬数据,我相信一个更好的处理方法会在稳定后添加到库中,所以它只是添加了不存在的特性