Ajax,重定向和DELETE

时间:2014-08-14 21:03:10

标签: javascript jquery rest http laravel

为了尊重Laravels约定,我希望我的用户在使用销毁路由时发出DELETE请求。

为了避免在每个删除链接上设置繁琐的表单,我已经设计了这条jQuery代码,它将任何带有a属性的method="delete"标记转换为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重定向。

关于如何去做的任何想法?

2 个答案:

答案 0 :(得分:1)

我不是使用Javascript来做这件事的粉丝。相反,我使用Form宏为我的RESTful资源插入删除按钮。 (我假设你有一个别名用于destroy方法,或者使用没有前缀的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);

答案 1 :(得分:0)

我找到了一个可行的解决方案,它使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();
  });
});