【问题标题】:Action refuses to return the boolean value动作拒绝返回布尔值
【发布时间】:2016-09-27 18:05:06
【问题描述】:

我有标准的destroy 操作:

public function destroy($id)
{
    return Quiz::find($id)->delete();
}

通过以下 AJAX 调用访问:

// The CSRF token is included automatically!
$.ajax({
    url: /quiz/10,
    type: 'POST',
    data: {_method: 'DELETE'},
    success: function(response){
        if(response){
            // do stuff..
        }
    }
});

问题

进行AJAX调用时,chrome控制台显示如下错误:

奇怪的是,如果我删除 return,一切正常, 但我需要返回状态码。有人可以解释为什么会这样吗?或者,至少,如何调试这个问题?

更新

如果我像这样重写destroy 操作,一切都会开始正常工作:

public function destroy($id)
{
    return Quiz::delete($id);
}

但我还是不明白为什么第一个动作不起作用?

【问题讨论】:

  • 那么,你检查过日志吗?
  • @Alexander Lomia,使用该 ID 可能找不到测验,所以您收到 Trying to get property of non-object 错误...
  • @zerkms 实际上,通过询问如何调试这个问题,我期待有人会解释在哪里/如何找到日志
  • @GiedriusKiršys 为什么会被删除?

标签: javascript ajax laravel laravel-5 laravel-5.2


【解决方案1】:

你不能返回一个布尔值(Quiz::find($id)->delete();返回truefalse),最好像下面这样,

$deleted =  Quiz::find($id)->delete(); //this will return true/false

return response()->json(['success' => $deleted]);

在前端

$.ajax({
    url: /quiz/10,
    type: 'POST',
    data: {_method: 'DELETE'},
    success: function(response){
        if(response.success == true){
            // do stuff..
        } else {
            // something went wrong when deleting the record.
        }
    }
});

【讨论】:

  • 感谢您的回答。事实上,只返回一个布尔值是可能的,请检查更新的问题
  • destroy() 将返回 10,而 delete() 返回 truefalse 这就是为什么 Quiz::destroy($id) 有效,因为 (0/1) 不被视为布尔值。
  • 我明白了。实际上只是返回一个布尔值导致了错误。您的解决方案就像一个魅力,谢谢。
【解决方案2】:

似乎出现Trying to get property of non-object 错误。
试试这个

public function destroy($id)
{
    return Quiz::destroy($id);
}

【讨论】:

  • 谢谢,您的解决方案有效(如果 destroydelete 交换),但我仍然不明白为什么我的操作无效,这两种变体之间有什么区别
  • 因为当你第一次调用你的 url /quiz/10 时,` Quiz::find($id)` 返回模型实例并且你对其执行delete 方法。更多时间Quiz::find($id) 返回 null,导致具有此 ID 的记录不再存在。所以你尝试在非对象上调用delete函数
  • 但是url不是只调用一次吗?
【解决方案3】:

你可以这样做

public function destroy($id) {

    $quiz =  Quiz::find($id);
    $quiz->delete();

    if ($quiz) {
        return response()->json('true');
    } else {
        return response()->json('false');
    }
}

响应显然是一个 json,如果测验已被删除,则包含 true,如果出现错误,则包含 false

我不擅长js但是:

$.ajax({
    url: /quiz/10,
    type: 'POST',
    data: {_method: 'DELETE'},
    success: function(response){
        if(response == 'true'){ // should work i guess
            // do stuff..
        }
    }
});

【讨论】:

  • 感谢您的回答。在这种情况下,if($quiz) 语句将始终评估为真。关于 javascript 代码,我的和你的 AJAX 调用完全相同
  • $quiz 模型在您删除后始终保留,因此例如当您运行以下命令时:$quiz->delete()$quiz->save() 将创建新记录。 if($quiz->delete()) 在这种情况下可以完美运行
  • 你说的有道理!但它对我有用,无论如何我希望你能找到解决方案
猜你喜欢
  • 1970-01-01
  • 2013-08-18
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2020-07-29
  • 2014-12-13
  • 1970-01-01
相关资源
最近更新 更多