骨干破坏不发送params

时间:2012-06-15 04:37:06

标签: ruby-on-rails-3 backbone.js destroy

我有一个我想要销毁的骨干模型,但是没有与请求一起发送参数,因此服务器返回“删除404未找到”错误。

我承认我的结构有点奇怪,因为我根据它们是否已经在列表中创建/销毁这些项目。

var list_item = new MyApp.Models.ListItem({item_id: this.model.id, group_id: this.model.group_id});

    if($(e.currentTarget).hasClass('add')){

            list_item.save(list_item, { 
                success: function(response){
                     this.model.attributes.addedtolist_id = response.id
                     console.log(this.model);
                },
                error: function(){
                     alert('could not save item');
                }
           });
    } else if($(e.currentTarget).hasClass('remove')) {
         list_item.id=this.model.addedtolist_id;
         list_item.attributes.id = this.model.addedtolist_id;
         console.log(list_item);
         list_item.destroy({
             success: function(){
                alert('delete');
             },
             error: function(){
               alert('could not uncheck');
            }
   });
}

在销毁之前list_item的控制台输出

_escapedAttributes: Object
_previousAttributes: Object
_setting: false
attributes: Object
 id: 2
 item_id: 66
 group_id: 64
__proto__: Object
cid: "c23"
id: 2
__proto__: q

但是当我查看使用删除请求发送的标头时,我没有发送任何参数。

-----------------------更新params被发送,404仍然被返回-------------- < / p>

根据Yaroslav的建议,我在destroy方法中添加了一个'header',但我的rails控制器仍然返回DELETE 404 not found错误。我只是想回到listitem,以确保在我销毁之前我得到了正确的一个。

我的控制器是

 def destroy
   listitem = Listitem.find(params[:id])
   return render :json => listitem
 end

3 个答案:

答案 0 :(得分:29)

我猜你在模型中将url设置为字符串:

Backbone.Model.extend({
    url: '/list_items',
    //...
});

这将告诉Backbone准确使用/list_items作为所有操作的URL。你应该使用一个函数:

url: function() { return '/list_items/' + encodeURIComponent(this.id) }

或使用urlRoot的字符串,并让默认的url函数添加id

urlRoot: '/list_items'

答案 1 :(得分:2)

你期望发送什么样的短信?默认情况下,Destroy仅通过url生成一个http删除请求,没有正文或任何其他标题。 params参数适用于jquery ajax函数,因此您可以在那里指定标题:

model.destroy({
...
    headers : {
        your_header : 123
    }
})

答案 2 :(得分:0)

list_item.destroy( **l** {
  success: function(){
  alert('delete');
}, ... );

问题是额外的第一个吗?