首页 文章

Laravel使用ajax更新数据库

提问于
浏览
1

嘿伙计们'm using laravel 5.7 and I'我试图做一个ajax post请求来更新我的数据库 . ajax将根据更改功能的复选框发布 . 例如,如果我切换复选框,它将发送请求并将我的状态更新为 Inactive 表中的 Inactive . 尝试之后,我的错误是 405 (Method Not Allowed) . 谁能够记下我做错了什么?很抱歉,如果我的代码中有一些错误的代码或语法,因为我对Ajax很新 . 任何帮助,将不胜感激 .

Ajax

$(document).ready(function(){
    $.ajax({
        type:'get',
        url:'{!!URL::to('findStatus')!!}',
        success:function(data){
            for(var i=0;i<data.length;i++){

                var checkBox = document.getElementById('switch-'+data[i].u_id);

                console.log(checkBox);

                if(data[i].status == "Active"){
                    $('#switch-'+data[i].u_id).prop('checked',true);
                }

                else if(data[i].status == "Inactive")
                {
                    $('#switch-'+data[i].u_id).prop('checked',false);
                } 


                $('#switch-'+data[i].u_id).change(function(){
                    $.ajax({
                        type: "POST",
                        url : '{!!URL::to('admin/{admin}')!!}',
                        success:function(data){
                            console.log(data);
                        }
                    });
                });
            }
        },
        error:function(data){
            console.log('ERROR');
        }
    });
});

Route

Route::resource('admin','AdminController');  << I'm using the update method from the resource controller

Controller

public function update(Request $request, $id)
{
    $user = User::find($id);
    if($user->status == "Active"){
        $user->status = "Inactive";
        $user->save();
    }else{
        $user->status = "Active";
        $user->save();
    }
    return response()->json($user);
}

Form

{!!Form::open(array('action'=>['AdminController@update',$item->u_id],'method'=>'POST','id'=>'update'))!!}
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <input type="hidden" name="u_id" id="u_id" value="{{$item->u_id}}">
    <label class="custom-control custom-checkbox">
        <input type="checkbox" id="switch-{{$item->u_id}}" class="custom-control-input">
        <span class="custom-control-indicator"></span>
    </label>
    {{-- <button class="btn btn-primary">Update</button> --}}
{{Form::hidden('_method','PUT')}}
{!!Form::close()!!}

UPDATE

我已经设法"pass" u_id到我的帖子请求,通过 target.id 获取id并将其与 - 分开 . 它不是最优雅的方式,但它的工作原理 . 但现在我得到一个错误

POST http://manageme.test/admin/%7B2%7D 500(内部服务器错误)

这是我在我的代码中更新的内容 .

$('#switch-'+data[i].u_id).change(function(e){

    console.log(e.target.id);

    var s = e.target.id;
    var split = s.split('-')[1];

    $.ajax({
        type: "POST",
        url: `{!!url('admin/')!!}/{${split}}`,
        data: { _token: "{{ csrf_token() }}", _method: "PUT" },
        success:function(data){
            console.log(data);
        }
    }); 
});

这些都在我的更新控制器中

public function update(Request $request, $id)
{
    $user = User::find($id);
    if($user->status == "Active"){
        $user->status = "Inactive";
        $user->save();
    }else{
        $user->status = "Active";
        $user->save();
    }
    return response()->json($user);
}

我还查看了dev工具的网络选项卡中的错误,laravel的错误消息是 message: "Trying to get property 'status' of non-object" . 我认为它无法在更新方法中找到任何 $user

2 回答

  • 0

    而不是:“{!! URL :: to('admin / ')!!}”写:{!! url('admin /')!!} / $ {data [i] .u_id}并将_token和_method参数添加到您的ajax数据中并像这样写:

    $(document).ready(function () {
      $.ajax({
        type: 'get',
        url: '{!!url('findStatus')!!}',
        success: function (data) {
          data.forEach(d => {
            console.log(d);
            if (d.status == "Active") {
              $(`#switch-${d.u_id}`).prop('checked', true);
            }
            else if (d.status == "Inactive") {
              $(`#switch-${d.u_id}`).prop('checked', false);
            }
            $(`#switch-${d.u_id}`).change(function () {
              console.log(d);
              //changed###########
              $.ajax({
                type: 'POST',
                url: `{!!url('admin/')!!}/${d.u_id}`,
                data: { _token: "{{ csrf_token() }}", _method: "PUT" },
                success: function (data) {
                  console.log(data);
                }
              });
              //###################
            });
          });
        },
        error: function (data) {
          console.log('ERROR');
        }
      });
    });
    
  • 0

    Solution

    我设法解决了问题是来自试图传递用户的 u_id 并找到用户数据的路线 . 因此,我没有在内部输入url,而是创建了一个变量来将路径和u_id一起传递 . 这是代码

    Ajax

    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });
    
    
    $.ajax({
        type:'get',
        url:'{!!url('findStatus')!!}',
        success:function(data){
            for(var i=0;i<data.length;i++){
    
                var checkBox = document.getElementById('switch-'+data[i].u_id);
    
    
                if(data[i].status == "Active"){
                    $('#switch-'+data[i].u_id).prop('checked',true);
                }
    
                else if(data[i].status == "Inactive")
                {
                    $('#switch-'+data[i].u_id).prop('checked',false);
                } 
    
    
                $('#switch-'+data[i].u_id).change(function(e){
                    var s = e.target.id;
                    var split = s.split('-')[1];
                    var url = '{{route('admin.update','split')}}';
    
                    $.ajax({
                        type: 'POST',
                        url: url,
                        data: { _token: "{{ csrf_token() }}", _method: "PUT" ,u_id: split},
                        success: function(data) {
                            console.log(data['message']);
                        }
                    });
                });
            }
        },
        error:function(data){
            console.log('ERROR');
        }
    });
    

    Update method

    public function update(Request $request, $id)
    {
        $user = User::find($request['u_id']);
    
        if($user->status == "Active")
        {
            $user->status = "Inactive";
            $user->save();
            return response()->json(['message' => 'Update to Inactive']);
        }else{
            $user->status = "Active";
            $user->save();
            return response()->json(['message' => 'Update to Active']);
        }       
    }
    

    DONT 忘记将元标记添加到csrf标记的文档 Headers 中

    <meta name="csrf-token" content="{{ csrf_token() }}">
    

相关问题