【问题标题】:Form redirecting to route on ajax request in Laravel 5表单重定向到 Laravel 5 中 ajax 请求的路由
【发布时间】:2016-11-28 01:30:52
【问题描述】:

我正在尝试将 ajax 功能添加到点赞按钮。

一切正常,除了我在单击“赞”按钮后被重定向到包含 json 数据的页面。

我正在使用e.preventDefault(),但它仍在重定向我。

如果我使用 on('click'),我会在控制台日志中收到 TokenMismatch 错误,即使我已包含带有令牌的隐藏输入。

jquery.min.js:4 POST http://localhost/socialnet/public/likeStatus 500(内部服务器错误)

如果我使用on('submit'),数据会通过,但我会被重定向到带有 json 响应的页面。

这是在我的控制器FeedController@likeStatus()

public function likeStatus() {

    if (Input::has('like_status')) {
        $status = Input::get('like_status');
        $selectedStatus = Status::find($status);

        $selectedStatus->likes()->create([
            'user_id' => Auth::user()->id,
            'status_id' => $status
        ]);

        $response = array(
            'status' => 'success',
            'msg' => 'You have liked this status',
        );

        return Response::json($response);
    }
}

景色

{!! Form::open(['action' => 'FeedController@likeStatus', 'id' => 'like_form']) !!}
    {!! Form::hidden('like_status', $status->id) !!}
    {!! Form::hidden('user_id', Auth::user()->id) !!}
    <button type="submit" name="likeStatus" class="btn btn-info btn-xs" id="like-status">
          <i class="fa fa-thumbs-up"></i> Like ({{ $likes_count }})
    </button>
{!! Form::close() !!}

Javascript

$('#like-status').on('click', function(e){
    e.preventDefault();

    var status_id = $('input[name=like_status]').val();
    var user_id = $('input[name=user_id]').val();

    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').val()
        }
    });

    $.ajax({
        url: 'http://localhost/socialnet/public/likeStatus',
        method: 'post',
        data: {status_id: status_id, user_id: user_id},
        success: function( data ) {
            console.log(data.msg);
        }
    });
});

编辑:我刚刚将 CSRF 令牌添加到变量中并将其添加到 data

    var status_id = $('input[name=like_status]').val();
    var user_id = $('input[name=user_id]').val();
    var CSRF_TOKEN = $('meta[name="csrf-token"]').attr('content');

    $.ajax({
        url: 'http://localhost/socialnet/public/likeStatus',
        method: 'post',
        data: {status_id: status_id, user_id: user_id, _token: CSRF_TOKEN},
        success: function( data ) {
            console.log(data.msg);
        }
    });

这在“网络”选项卡中提供Status Code: 200,但在控制台中提供undefined,并且没有数据通过。

编辑 2: 发生了一些非常奇怪的事情。当我尝试喜欢最新状态时,我在控制台中收到undefined,但没有任何反应。但是当我喜欢以前的(旧)状态时它可以工作,但是当我单击like按钮时,我会被重定向到 json 数据页面并且数据会通过。

我做错了什么?

【问题讨论】:

  • 你在 PHP 中尝试过 var_dump 吗?你有什么收获吗?

标签: php jquery ajax laravel laravel-5


【解决方案1】:

看来问题出在你的PHP代码上,它寻找like_status with

if (Input::has('like_status'))

但你发送

{ 
 status_id: status_id, 
 user_id: user_id
}

找不到like_status。 Input::has... 将返回 false。你的代码基本上变成了

public function likeStatus() {

   if (Input::has('like_status')) { //It's always false
    //
   }
  return undefined;
}

【讨论】:

  • 它不能那样工作,你有输入名称 like_status,这就是为什么它没有 ajax 也能工作。但是使用 ajax,当您发送 status_id = like_status 时,PHP 将收到 status_id,而不是 like_status,如果您执行 var_dump(Input::all()) 我确定您不会看到字段 like_status
  • 你说得对,真不敢相信我错过了。我刚刚完成了整个工作,谢谢伙计。
【解决方案2】:

这意味着你的 ajax 调用根本不起作用,首先确保你的浏览器中启用了 Javascript 并且包含 jquery,如果它,然后尝试更改按钮类型提交到按钮,如果按钮是动态生成的,你可以也试试直播功能

 $('#like-button').live("click",function(){   })

尝试使用 jquery 提交调用的警报进行调试,以确保函数被调用

【讨论】:

    【解决方案3】:

    需要在成功的AJAX函数中加入这一行

    var new_data = JSON.parse(data);
    

    解码来自请求的数据

    【讨论】:

    • 这并没有改变任何东西。仍然得到相同的status 500 错误
    • 嗯,我认为是return Response::json($response);的错误,所以你把它改成return json_encode($response);
    • 使用什么版本的 Laravel?
    • 我使用的是 Laravel 5.2
    【解决方案4】:

    您应该使用.on('submit'),因为这样您可以正确地阻止表单的默认重定向操作。

    就目前而言,您正试图取消#like-status 上的点击事件。

    确保您的 jQuery 函数的开头是:

    $('#like_form').on('submit', ... 
    

    为了更加安全以确保事件处理程序被正确绑定,您还应该在$(document).ready 内绑定,如下所示:

    $(document).ready( function () {
    
        $('#like_form').on('submit', ... 
    
    }
    

    【讨论】:

    • 我正在这样做,我将 click 更改为 submit 并且仍然遇到相同的错误。如果我用这个$('meta[name="csrf-token"]').attr('content') 获取令牌,我会在控制台中得到undefined,但使用val() 我会得到500 Internal Error
    • 抛出 500 内部服务是为了什么?您可以通过右键单击 Chrome 控制台并勾选 Log XmlHttpRequests,然后单击控制台中的响应来查看 AJAX 请求的响应。或者检查laravel.log,它将列出堆栈跟踪。这可能是因为 CSRF 不匹配,或者 CSRF 正在工作,而这是您的控制器功能中的错误。
    • 是的,这是给 Status: 500 和 laravel.log 是给 TokenMismatchException 错误,但我不明白,我在 ajax 请求中包含了令牌。
    • 尝试this method 将令牌与请求一起发送,而不是使用ajaxSetup
    • 我在app 的根目录中没有filters.php
    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2021-06-04
    • 2021-09-17
    • 2016-05-13
    相关资源
    最近更新 更多