2014-02-11 88 views
0

阅读播放2.2.1文档后,我可以看到没有内置的机制来处理HTTP删除方法? (也不是吗?)当我说内置的我的意思是,例如,轨道有method="delete",它可以与<a></a>一起使用来通过DELETE动词调用动作。
因此,例如在以下图片我有一个用户列表(GET /用户...)。 enter image description here播放框架2.2.1通过ajax删除记录,方法:删除

我所理解的,我可以通过AJAX调用模拟delete方法,所以我尝试了以下方法:

// index.scala.html

@users.map { user => 
... 
<td> <a href="#" class="delete-user" data-id="@user.getId()"> Delete </td> 
... 
} 

//的script.js

$(function() { 
    $('.delete-user').click(function() { 
     var id = $(this).data('id'); 
     var $that = $(this); 

     $.ajax({ 
      url: jsRoutes.controllers.Users.delete(id).url, 
      type: "DELETE" 
     }).done(function() { 
      $that.closest('tr').remove(); 
     }); 
    }); 
}); 

// Users.java(控制器)

@Transactional 
public static Result delete(Long id) { 
    JPA.em().remove(JPA.em().find(User.class, id)); 
    return ok("User with id=" + id + " has been deleted"); 
} 

那么这是正确的方式来做到这一点?或者我误解/忽略了文档?

+0

Rails并不真正以你理解的方式支持'PUT'和'DELETE'。相反,它使用'POST'并用隐藏字段模拟其他方法。所以是的,你在正确的轨道上。 –

+0

我在框架支持的背景下谈论。 – Srle

回答

2

你正在做正确的做法。我可能只是提一个人小的改进,你应该能够做到这一点:

$.ajax(
    jsRoutes.controllers.Users.delete(id) 
).done(function() { 
    $that.closest('tr').remove(); 
}); 

JavaScript的路由器方便地返回包含url属性,您已阅读的对象,但它也包含了type财产,如果您的路线配置为DELETE路线,则其值将为DELETE。在我的应用我会经常写一个辅助方法,可以让我轻松其他属性jQuery的AJAX请求调用加太多,如:

function ajax(route, params) { 
    return $.ajax($.extend(params, route)) 
} 

然后,我可以做这样的事情:

ajax(jsRoutes.controllers.Users.delete(id), { 
    headers: { "Auth-Token": "foobar" } 
}).done(...) 
0

您也可以直接使用路由对象来进行呼叫,例如

jsRoutes.controllers.Users.delete(id).ajax({ 
    done: function (data) { 
    $that.closest('tr').remove(); 
    } 
});