在 Rails API 中获取未找到记录的原始 SQL 响应的一部分

Getting part of the raw SQL in Rails API response for not found records

我创建了一个 Rails 5 应用程序,其中 config.api_only 设置为 true,并实现了一个控制器操作,该操作删除了作用域模型中的记录 Message 问题是当我尝试要删除不存在的记录,ActiveRecord::RecordNotFound 异常消息包含范围内使用的 SQL 查询的一部分,可以不在异常消息中包含 SQL ?

型号代码:

class Message < ActiveRecord::Base
  scope(:active) { where(active: true) }
end

控制器代码

class MessageController < ApplicationController
  def delete
    message = Message.active.find(params[:id])
    begin
      message.destroy
      head :accepted # 202
    rescue ActiveRecord::RecordNotFound => error
      render json: { error: error.message }, status: 404
    end
  end
end

如果我发送错误的 ID,我希望得到下一个回复:

{
    "error": "Couldn't find Message with 'id'=23444"
}

但是,我收到了这个错误:

{
    "error": "Couldn't find Message with 'id'=23444 [WHERE \"message\".\"active\" = ]"
}

据我所知,没有配置可以更改 ActiveRecord::RecordNotFound 异常错误消息。您可以做的最好的事情是在没有范围的情况下获取消息,然后在执行销毁和 return 适当的错误消息之前检查它是否处于活动状态。

class MessageController < ApplicationController
  def delete
    message = Message.find(params[:id])
    if message.active
      message.destroy
      head :accepted # 202
    else
      render json: { error: "Couldn't find Message with 'id'=#{params[:id]}" }, status: 404
    end
  rescue ActiveRecord::RecordNotFound => error
    render json: { error: error.message }, status: 404
  end
end

当您在错误消息中看到 SQL 部分时,我假设您的应用程序 运行 处于 'development' 模式。默认情况下,当 运行 处于 'production' 模式时,Rails 将不再包含该信息。