Обработка ActiveRecord :: RecordNotFound с помощью ActionController :: Metal
Я нахожусь на стадии разработки (JSON) API и решаю унаследовать мойApiController
изActionController::Metal
чтобы воспользоваться преимуществами скорости и т. д.
Поэтому я включил несколько модулей, чтобы это работало.
Недавно я решил ответить пустым результатом, когда запись не найдена. Рельсы уже кидаетActiveRecord::RecordNotFound
изModel#find
метод, и я пытался использоватьrescue_from
чтобы поймать это и написать что-то вроде этого:
module Api::V1
class ApiController < ActionController::Metal
# bunch of included modules
include ActiveSupport::Rescuable
respond_to :json
rescue_from ActiveRecord::RecordNotFound do
binding.pry
respond_to do |format|
format.any { head :not_found }
end
end
end
end
После вызова моего простого действия
def show
@post = Post.find(params[:id])
end
И исполнение никогда не достигнетrescue_from
, Это броски:
ActiveRecord::RecordNotFound (Couldn't find Post with id=1
в мой лог-файл.
Я пробовал это и в производственном режиме. Сервер отвечает 404, но тело ответа является стандартнымHTML страница ошибки дляJSON запрос.
Это хорошо работает, когда я меняю наследство сActionController::Metal
вActionController::Base
.
Вы можете заметить отсутствиеrespond_with
вызов. Это потому что я используюRABL как моя система шаблонов.
Таким образом, вопрос: есть ли шансы сделатьrescue_from
работать сMetal
или избавиться от HTML из ответа?