В этом посте ошибки спасены как в методах API, так и в базовом контроллере. Но это может быть не лучший подход к обработке ошибок по следующим причинам:
- Толстые контроллеры
- СУХОЙ
- Ремонтопригодность
В ActionController::Base мы обрабатывали ActiveRecord::RecordNotFound только в ApplicationController. Но для ActionController::API мне нужно спасать ActiveRecord::RecordNotFound в каждом контроллере. Итак, есть ли лучший подход для решения этой проблемы?
Использование Rails 5 и гема «active_model_serializers» для API
ActionController::API
module Api
module V1
class UsersController < ActionController::API
before_action :find_user, only: :show
def find_user
@user = User.find(params[:id])
rescue ActiveRecord::RecordNotFound => e
render json: { error: e.to_s }, status: :not_found
end
end
end
end
ActionController:: База
class ApplicationController < ActionController::Base
protect_from_forgery with: :null_session
rescue_from ActiveRecord::RecordNotFound, with: :record_not_found
private
def record_not_found
render file: "#{Rails.root}/public/404", layout: true, status: :not_found
end
end