Ajax、重定向和DELETE

Ajax, redirect and DELETE

本文关键字:DELETE 重定向 Ajax      更新时间:2023-09-26

为了遵守Laravels的约定,我希望我的用户在使用destroy路由时发出DELETE请求。

为了避免在每个删除链接上设置繁琐的表单,我设计了这段jQuery代码,它将任何带有method="delete"属性的a标记转换为delete请求:

$(function() {
  $("a[method='delete']").on('click', function(event) {
    event.preventDefault();
    target = this.getAttribute('href')
    request = new XMLHttpRequest()
    request.open('delete', target, false);
    request.send();
  });
});

这段代码几乎完成了任务。但是,当我的控制器在destroy方法中处理DELETE请求时,它们应该重定向用户。例如,如果他破坏了一个资源,他应该被重定向到资源索引。

我正试图找到一种干净的方式来做到这一点,而不用响应一个特殊的JSON体,但只是使用一个标准的303重定向。

你知道怎么做吗?

我不喜欢用Javascript来做这件事。相反,我使用Form宏为我的RESTful资源插入删除按钮。(我假设你有一个别名销毁方法,或使用Laravel的Route::resource()没有前缀,否则相应地调整。)

Form::macro('delete', function($resource, $id) {
    $form_parameters = array(
        'method' => "DELETE",
        'url'    => URL::route("$resource.destroy", $id),
    );
    return Form::open($form_parameters)
            . Form::submit('Delete')
            . Form::close();
});

然后,对于刀片模板,我可以这样写:

{{ Form::delete('post', 1) }}

最后,在假设的post控制器的destroy方法中正常进行303重定向。

return Redirect::to(URL::route('post.index'), 303);

我找到了一个可行的解决方案,它使JavaScript函数有点脏,但保持HTML的其余部分干净。它的工作原理是创建一个带有post请求和隐藏方法属性的虚拟表单并提交它,从而处理请求并重定向用户。

请记住,在提交表单之前必须将表单附加到DOM,否则一些浏览器会忽略表单提交。

$(function() {
  $("a[method='delete']").on('click', function(event) {
    event.preventDefault();
    target = this.getAttribute('href')
    form_string = "<form method='"POST'" action='"" + target + "'" accept-charset='"UTF-8'"><input name='"_method'" type='"hidden'" value='"DELETE'"></form>"
    form = $(form_string)
    form.appendTo('body');
    form.submit();
  });
});