在Laravel中使用ajax发布表单
问题描述:
I know this question has been out there many times, however I am unable to get through this.
Here is my route:
Route::post('/masters/board/edit', 'MastersController@editBoard');
My Controller:
public function editBoard() {
$board = Board::findOrFail(Input::get('id'));
$board->nick_name = Input::get('nick_name');
$board->board_name = Input::get('board');
$board->type = Input::get('type');
$board->save();
return Redirect::action('MastersController@getBoards');
}
My JS:
$("#edit_form").submit(function(e) {
e.preventDefault();
var type = "#edit_form";
var formData = {
id : $(type + " #id").val(),
nick_name : $(type + " #nick_name").val(),
name : $(type + " #board").val()
}
$.ajax({
type: "POST",
url: "masters/board/edit",
data: formData,
success: function(data) {
console.log(data);
}
});
});
});
This is throwing an error:
[Error] Failed to load resource: the server responded with a status of 500 (Internal Server Error) (edit, line 0)
Can anyone see a reason why?
我知道这个问题已多次出现,但我无法解决这个问题。 p>
这是我的路线: p>
Route :: post('/ masters / board / edit','MastersController @ editBoard');
pre>
我的控制器: p>
public function editBoard(){
$ board = Board :: findOrFail(Input :: get('id'));
$ board-> nick_name = Input :: get('nick_name');
$ board-> board_name = Input :: get('board');
$ board - > type = Input :: get('type');
$ board-> save();
返回Redirect :: action('MastersController @ getBoards');
}
code> pre>
我的JS: p>
$(“#edit_form”)。submit(function(e){
e.preventDefault ();
var type =“#edit_form”;
var formData = {
id:$(type +“#id”)。val(),
nick_name:$(type +“ #nick_name“)。val(),
name:$(type +”#board“)。val()
}
$ .ajax({
type:“POST”,
url:“masters / board / edit”,
data:formData,
success:function(data){
console.log (数据);
}
});
});
});
code> pre>
这是一个错误: p> \ n
[Error]无法加载资源:服务器响应状态为500(内部服务器错误)(编辑,第0行)
code> pre>
任何人都可以看到原因吗? p>
div>
答
Add a meta tag with the csrf_token
.
<meta name="_token" content="{{ csrf_token() }}" />
And add that token to your data.
var formData = {
id : $(type + " #id").val(),
nick_name : $(type + " #nick_name").val(),
name : $(type + " #board").val()
_token: $('meta[name="_token"]').attr('content')
}
If you are going to perform lot of post requests try the following. Use the following script to setup your ajax requests with the csrf token.
$(function() {
$.ajaxSetup({
headers: {
'X-CSRF-Token': $('meta[name="_token"]').attr('content')
}
});
});
If you are using laravel 5 this should work out of the box.
If not you need to edit your app/filters.php
file.
Replace the csrf filter with the following.
Route::filter('csrf', function() {
$token = Request::ajax() ? Request::header('X-CSRF-Token') : Input::get('_token');
if (Session::token() != $token)
throw new Illuminate\Session\TokenMismatchException;
});