【问题标题】:cannot persist destroy to database, can retrieve无法持久销毁数据库,可以检索
【发布时间】:2013-01-09 02:11:09
【问题描述】:

我有一个使用主干的 Rails 应用程序。在控制台中,我可以创建一个集合,从服务器(3)获取文档,我通过检查长度来确认

文档 = 新文档();
docs.fetch();
文档长度
3

获取其中一份文档

d1 = docs.at(0) 对象 { cid= “c3” , 改变={...}, 属性={...}, 更多...}

销毁文档

d1.destroy(); 删除 http: localhost:3000/docs/1
204 无内容 23ms jquery.js?body=1(第 8215 行) 对象 { 就绪状态 = 1 , setRequestHeader=function(), getAllResponseHeaders=function(), 更多...}

检查文档的长度

>>> docs.length

2

创建一个新的集合

docz = new Docs();

从服务器获取文件。注意“304 Not modified message”

docz.fetch(); 获取 http://localhost:3000/docs 304 未修改 31毫秒
jquery.js?body=1(第 8215 行) 对象 { 就绪状态 = 1 , setRequestHeader=function(), getAllResponseHeaders=function(), 更多...}

检查长度。它是 3,而我预计它是 2。

>>> docz.length

3

我不知道为什么当我调用 destroy 时,如果明显有 3 条记录,我会收到一条无内容消息

204 No Content
        23ms

当我从数据库中检索记录时,访问数据没有问题

d.get('title')
>>>"diet book"

我在模型上设置了一个 url,所以我应该能够删除我认为的单个记录

   url : function() {
       var base = 'docs';
       if (this.isNew()) return base;
       return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id;
    },

但是,我也无法删除通过集合docs.at(0).destroy 具有相同的效果。

这是我在 rails 控制器中的销毁函数

class DocsController < ApplicationController


    respond_to :json
    ....

   def destroy
     respond_with Doc.find(params[:id])
   end 
end 

型号

 class Doc < ActiveRecord::Base
  attr_accessible :keywords, :text, :title
 end

更新 一位评论此帖子的人指出,当我调用destroy 时,我应该销毁某些东西,但我认为对对象调用destroy 会破坏对象

d.destroy()  #should destroy d, shouldn't it?

这是我从文档中了解到的

 book.destroy({success: function(model, response) {
  ...
}});

确实,当我对一个对象调用 save() 时,它会将对象保存到数据库中

d.save(); #this works, so why not d.destroy();

【问题讨论】:

  • 抱歉,忘记包含开头段落。现在应该好多了。
  • 你的destroy,难道不应该破坏一些东西吗?
  • @muistooshort 我在对象上调用它。 d.destory()。因此破坏对象。我该怎么称呼它?当我创建个人记录时,我也在 ojbect 上进行。 d.save() 工作正常。你能详细说明一下吗?
  • 您在服务器端的destroy 控制器方法看起来像show,因为它只是将Doc 发回。 destroy 控制器应该破坏某些东西。

标签: ruby-on-rails backbone.js


【解决方案1】:

当您在 Backbone 代码中执行此操作时:

d.destroy();

您将触发对服务器的 DESTROY 请求,客户端模型将被销毁和清理。您的服务器代码必须通过销毁服务器端模型来处理 DESTROY 请求;你的 destroy 控制器不这样做:

def destroy
  respond_with Doc.find(params[:id])
end

所做的只是从数据库中提取适当的Doc 并将其发送回客户端:您的destroy 控制器需要销毁服务器端模型。您需要调整控制器方法以包括:

doc = Doc.find(params[:id])
doc.destroy

finddestroy 调用进行一些权限检查、错误检查和异常处理也可能是个好主意。

【讨论】:

  • 谢谢,当我将这两行放在控制器中时,它说 500 服务器错误模板丢失。你能告诉我如何在删除时执行 json respond_with,以免它产生那个错误吗?
  • respond_with Doc.destroy(params[:id]) 感谢您的帮助!找到了关于json响应的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 2019-01-30
  • 2021-09-19
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多