Обработка 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 из ответа?

Ответы на вопрос(1)

Ваш ответ на вопрос