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

时间:2019-08-31 05:54:32

标签: laravel laravel-5.8

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

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

和其他保存该数据的方法,如下所示:

// To save Project definition Data
        Route::get('/store-project-definition-data/{id}', 'Participant\ParticipantProjectDefinitionController@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('App\Model\ProjectDefinitionFields');
        return $this->belongsTo('App\Model\ProjectDefinitionFields');
   }
on projectDefinitionFields
  public function projectDefinition(){
        return $this->belongsTo('App\Model\ProjectDefinition');
    }

这是我的create.blade.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

3 个答案:

答案 0 :(得分:1)

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

您可以尝试使用此路线,它将解决405

答案 1 :(得分:0)

以表格形式添加方法属性

method="post"

更改路线

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

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

答案 2 :(得分:0)

首先,您应该在这里发布您的问题和问题所在,我们不需要查看所有代码即可解决基本问题。 您的表单应为:

<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}', 'Participant\ParticipantProjectDefinitionController@store')->name('participant.project-definition.store');

此外,在您的'ParticipantProjectDefinitionController-> store()'函数中, $id, User $user, ProjectDefinitionFields $ProjectDefinitionFields个参数,但您的路由器没有。我们可以这样解决:

Route::post('/store-project-definition-data/{id}/{user}/{ProjectDefinitionFields}', 'Participant\ParticipantProjectDefinitionController@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或其他地方做什么