Получение части ответа SQL в Rails API для не найденных записей - PullRequest
0 голосов
/ 17 апреля 2020

Я создал приложение 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

Я ожидаю получить следующий ответ, если отправлю неправильный идентификатор:

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

Но вместо этого я получаю это ошибка:

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

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Я предполагаю, что вы запускаете свое приложение в режиме разработки, когда видите сообщение SQL в сообщении об ошибке. По умолчанию Rails больше не будет включать эту информацию при работе в «производственном» режиме.

0 голосов
/ 17 апреля 2020

Насколько я знаю, нет конфигурации для изменения сообщения об ошибке ActiveRecord::RecordNotFound Exception. Лучшее, что вы можете сделать, это получить сообщение без области, а затем проверить, активно ли оно, перед выполнением уничтожения и вернуть соответствующее сообщение об ошибке.

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
...