为了尊重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
重定向。
关于如何去做的任何想法?
答案 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();
});
});