Для NameError: uninitialized constant ActionText::Engine::ApplicationController
где определяется ваш ApplicationController
? Кажется, что ActionText
требует, чтобы он был в app/controllers/application_controller.rb
и, возможно, унаследован от ActionController::Base
.
По мере разработки API я не ожидаю, что вам понадобится ActionText, и вы просто случайно загрузите его. Вам следует заглянуть в свой config/application.rb
файл и посмотреть, что загружается. Если есть require 'rails/all'
, вы должны загружать только то, что вам действительно нужно, например
require "action_controller/railtie"
require "active_record/railtie"
, но не знаете, как решать общие ошибки (помимо кодов состояния) в Rails API
Что касается общих ошибок, вы можете, например, использовать rescue_from
как это
class ApplicationController < ActionController::Base
rescue_from User::NotAuthorized, with: :deny_access # self defined exception
rescue_from ActiveRecord::RecordInvalid, with: :show_errors
rescue_from 'MyAppError::Base' do |exception|
render xml: exception, status: 500
end
private
def deny_access
...
end
def show_errors(exception)
exception.record.new_record? ? ...
end
end
https://apidock.com/rails/ActiveSupport/Rescuable/ClassMethods/rescue_from
Для общих ошибок это действительно не нужно иметь rescue_from StandardError
, так как это поведение Rails по умолчанию. В Rails есть промежуточное ПО под названием PublicExceptions
, которое делает (в основном) то, что вы хотите, поэтому вы можете просто позволить StandardError распространяться.
Вместо { error: "Internal Server Error" }
он будет отображать это
{
status: status,
error: Rack::Utils::HTTP_STATUS_CODES.fetch(status, Rack::Utils::HTTP_STATUS_CODES[500])
}
, которое в случае исключения отобразит { status: 500, error: "Internal Server Error" }
. Это должно быть разумным компромиссом.
Для разработки вы можете подумать об адаптации этого промежуточного программного обеспечения. Вы можете установить его с помощью config.exceptions_app
.
https://guides.rubyonrails.org/configuring.html#rails -general-configuration
https://api.rubyonrails.org/classes/ActionDispatch/PublicExceptions.html
https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/middleware/public_exceptions.rb#L14