Laravel 5:将数据存储到数据库时 服务器以状态 405(方法不允许)响应



我是Laravel的新手,并尝试通过ajax将数据添加到数据库中,但它抛出以下消息:"服务器响应状态为405(方法不允许(" 我为此定义了两条路线,用于表单页面

Route::get('/create/{id}', 'ParticipantParticipantProjectDefinitionController@create')->name('participant.project-definition.create');

和其他路由来保存这些数据,如下所示:

// To save Project definition Data
Route::get('/store-project-definition-data/{id}', 'ParticipantParticipantProjectDefinitionController@store')->name('participant.project-definition.store');

我正在使用的 Ajax 代码是这样的:


function storeDefinitionFormData(addUrl, token, baseUrl){
$('#create_project_definition_data').click(function(e){
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
e.preventDefault();
var form_fields = [];
var counter = 0;
$('.form-group').each(function(){
var values = {
'field_name' : $('#field_name_' + counter).val(),
'field_data' : $('#field_data_' + counter).val(),
};
form_fields.push(values);
counter++;
});
$.ajax({
type: 'POST',
dataType: 'JSON',
url: addUrl,
data: {
'_token' : token,
'customer_name' : $('#field_name_0').val(),
'customer_name' : $('#field_data_0').val(),
// 'form_fields' : form_fields
},
success: function(data){
alert('done');
window.location = baseUrl;
},
error: function(data){
alert('fail');
if(data.status == 422){
errors = data.responseJSON.errors; // => colllect all errors from the error bag
var fieldCounter = 0;
$('.help-block').show();
$('.validation').empty(); // => clear all validation
// display the validations
$('.validation').css({
'display' : 'block'
});
// iterate through each errors
$.each(errors, function(key, value){
if(key.includes('form_fields.')){
var field_errors = key.split('.');
var field_error = field_errors[2] + "_" + field_errors[1];
$('#' + field_error + '_error').append("<i class='zmdi zmdi-alert-circle' style='font-size: 15px;'></i> " + value); // => append the error value in the error message
}
$('#' + key + '_help').hide();
$('#' + key + '_error').append("<i class='zmdi zmdi-alert-circle' style='font-size: 15px;'></i> " + value); // => append the error value in the error message
});
}
}
});
});
}

控制器代码

/**
* create project Definition Form
*
*/
public function create(request $request, $id){
$ProjectDefinitionFields = ProjectDefinitionFields::all();
$ProjectDefinitionFieldRow = ProjectDefinitionFields::where('project_definition_id','=', $id)->get();
// dd($ProjectDefinitionFieldRow);
return view('participants.project_definition.create', ['ProjectDefinitionFieldRow' => $ProjectDefinitionFieldRow]); 
}
public function store(request $request, $id,  User $user, ProjectDefinitionFields $ProjectDefinitionFields){
$project = ProjectDefinitionFields::find('field_id');
$count = ProjectDefinitionFields::where('project_definition_id','=', $id)->count();
$pd_id = ProjectDefinitionFields::where('project_definition_id','=', $id)->get();
for($i=0;$i<$count;$i++){
$data[]= array (
'field_name'=>$request->get('field_name_'.$i),
'field_data'=>$request->get('field_data_'.$i),
'user_id' => Auth::user()->id,
// 'user_id' => $request->user()->id,
'project_definition_id' => $pd_id,
// 'field_id' => $projectDefinitionFields->id,
);            
}
$project_data = ProjectDefinitionData::create($data); 
if($project_data){
return response()->json($project_data);
}
} 

on ProjectDefinition 
public function formFields(){
// return $this->hasMany('AppModelProjectDefinitionFields');
return $this->belongsTo('AppModelProjectDefinitionFields');
}
on projectDefinitionFields
public function projectDefinition(){
return $this->belongsTo('AppModelProjectDefinition');
}

这是我的创建刀片.php

<form id="create_project_definition_data_form" enctype="multipart/form-data" >
@csrf
{{ method_field('PUT') }}
<?php $count = 0; ?>
@foreach($ProjectDefinitionFieldRow as $value)
<div class="row">
<div class="form-group col-md-12" id="form-group">
<div class="row">
<label for="definition_data_<?php  echo $count; ?>" class="col-sm-2 col-md-2  col-form-label" id="field_name_<?php  echo $count; ?>" name="field_name_<?php  echo $count; ?>[]" value="{{$value->field_name }}">{{$value->field_name }}</label>
<div class="col-sm-10 col-md-10">
{{--  textbox = 1
textarea = 0 --}}
<<?php  if($value->field_type = 1){echo "input";}else{echo "textarea";} ?> class="form-control" name="field_data_<?php  echo $count; ?>[]" placeholder="Enter project definition_data" id="field_data_<?php  echo $count; ?>" aria-describedby="field_data_help"></<?php if($value->field_type = 1){echo "input";}else{echo "textarea";} ?>>
<small id="field_data_help_<?php  echo $count; ?>" class="form-text text-muted help-block">
Optional Field.
</small>
<span id="field_data_error_<?php  echo $count; ?>" class="invalid-feedback validation"></span>
</div>
</div>
</div>
</div>
<hr />
<?php $count++; ?>
@endforeach
<div class="text-center">
<button type="submit" class="btn btn-primary" id="create_project_definition_data">Create Project Defination Data</button>
</div>
</form>
@section('scripts')
<script src="{{ asset('js/participants/project-definition.js') }}"></script>
<script>
// on document ready
$(document).ready(function(){
var baseUrl = "{{ url('/') }}";
var indexPdUrl = "{{ route('participant.projectDefinition') }}";
var token = "{{ csrf_token() }}";
{{-- // var addUrl = "{{ route('participant.project-definition.create') }}";  --}}
storeDefinitionFormData(token, baseUrl);
// console.log(addUrl);
});
</script>

错误

Request URL:http://127.0.0.1:8000/participant/project-definition/create/2kxMQc4GvAD13LZC733CjWYLWy8ZzhLFsvmOj3oT
Request method:POST
Remote address:127.0.0.1:8000
Status code: 405 Method Not Allowed
Version:HTTP/1.0

在表单中添加方法属性

method="post"

将您的路线从

Route::get('/store-project-definition-data/{id}', 'ParticipantParticipantProjectDefinitionController@store')->name('participant.project-definition.store');

Route::post('/store-project-definition-data/{id}', 'ParticipantParticipantProjectDefinitionController@store')->name('participant.project-definition.store');

首先,你应该在这里发布你的问题是什么,你的问题在哪里,我们不需要看到你所有的代码来解决一个基本问题。 您的表格应该是这样的:

<form id="create_project_definition_data_form" enctype="multipart/form-data" method='post'>
@csrf
<?php $count = 0; ?>
@foreach($ProjectDefinitionFieldRow as $value)
<div class="row">
<div class="form-group col-md-12" id="form-group">
<div class="row">
<label for="definition_data_<?php  echo $count; ?>" class="col-sm-2 col-md-2  col-form-label" id="field_name_<?php  echo $count; ?>" name="field_name_<?php  echo $count; ?>[]" value="{{$value->field_name }}">{{$value->field_name }}</label>
<div class="col-sm-10 col-md-10">
{{--  textbox = 1
textarea = 0 --}}
<<?php  if($value->field_type = 1){echo "input";}else{echo "textarea";} ?> class="form-control" name="field_data_<?php  echo $count; ?>[]" placeholder="Enter project definition_data" id="field_data_<?php  echo $count; ?>" aria-describedby="field_data_help"></<?php if($value->field_type = 1){echo "input";}else{echo "textarea";} ?>>
<small id="field_data_help_<?php  echo $count; ?>" class="form-text text-muted help-block">
Optional Field.
</small>
<span id="field_data_error_<?php  echo $count; ?>" class="invalid-feedback validation"></span>
</div>
</div>
</div>
</div>
<hr />
<?php $count++; ?>
@endforeach
<div class="text-center">
<button type="submit" class="btn btn-primary" id="create_project_definition_data">Create Project Defination Data</button>
</div>
</form>

在创建新内容时,您应该使用"post"方法,这比使用"get"方法更安全。 所以也改变路线方法。

Route::post('/store-project-definition-data/{id}', 'ParticipantParticipantProjectDefinitionController@store')->name('participant.project-definition.store');

此外,在您的"参与者项目定义控制器->store(("函数中具有$id, User $user, ProjectDefinitionFields $ProjectDefinitionFields参数,但您的路由器没有。我们可以这样修复它:

Route::post('/store-project-definition-data/{id}/{user}/{ProjectDefinitionFields}', 'ParticipantParticipantProjectDefinitionController@store')->name('participant.project-definition.store');

这意味着您应该将它们全部传递给控制器。 因此,我们可以像这样编辑您的 Ajax 调用:

function storeDefinitionFormData(addUrl, token, baseUrl){
$('#create_project_definition_data').click(function(e){
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
e.preventDefault();
var form_fields = [];
var counter = 0;
$('.form-group').each(function(){
var values = {
'field_name' : $('#field_name_' + counter).val(),
'field_data' : $('#field_data_' + counter).val(),
};
form_fields.push(values);
counter++;
});
$.ajax({
type: 'POST',
dataType: 'JSON',
url: addUrl,
data: { // $id,  User $user, ProjectDefinitionFields $ProjectDefinitionFields
'_token' : token,
'id' : 'your_id_field',
'user' : '{{ Auth::user() }}', 
'ProjectDefinitionFields' : 'your_definition_fields' // you need to pass type of 'ProjectDefinitionFields'
},
success: function(data){
alert('done');
window.location = baseUrl;
},
error: function(data){
alert('fail');
if(data.status == 422){
errors = data.responseJSON.errors; // => colllect all errors from the error bag
var fieldCounter = 0;
$('.help-block').show();
$('.validation').empty(); // => clear all validation
// display the validations
$('.validation').css({
'display' : 'block'
});
// iterate through each errors
$.each(errors, function(key, value){
if(key.includes('form_fields.')){
var field_errors = key.split('.');
var field_error = field_errors[2] + "_" + field_errors[1];
$('#' + field_error + '_error').append("<i class='zmdi zmdi-alert-circle' style='font-size: 15px;'></i> " + value); // => append the error value in the error message
}
$('#' + key + '_help').hide();
$('#' + key + '_error').append("<i class='zmdi zmdi-alert-circle' style='font-size: 15px;'></i> " + value); // => append the error value in the error message
});
}
}
});
});
}

在尝试之前,我会给你一个建议。阅读整个文档并查看其他人在 github 或其他地方所做的事情

Route::match(['GET','POST'],'/store-project-definition-data/{id}', 'ParticipantParticipantProjectDefinitionController@store')->name('participant.project-definition.store');

你可以试试这个路线,它将解决405

最新更新