Как бороться с общими ошибками в Rails API? - PullRequest
0 голосов
/ 11 июля 2020

Пытаюсь настроить API-интерфейс rails, получаю эту ошибку, как через консоль, так и в реальных запросах API:

Rack app error handling request { POST /login } #<NameError: uninitialized constant ActionText::Engine::ApplicationController

Это мой ApplicationController:

class ApplicationController < ActionController::API
    before_action :authorized

    def encode_token(payload)
        JWT.encode(payload, 's3cr3t')
    end

    def auth_header
        #requesting the header type of authorization (with token) that we will declare through our api requests
        # { Authorization: 'Bearer <token>' }
        request.headers['Authorization']
    end

    def decoded_token
        if auth_header
            #going to take the token and decode it
            # we're only concerned about the first index which will be a token with key of *user_id*
            token = auth_header.split(' ')[1]
            # header: { 'Authorization': 'Bearer <token>' }
            begin
                JWT.decode('s3cr3t', true, algorithm: 'HS256')
            rescue JWT::DecodeError
                nil
            end
        end
    end

    def logged_in_user
        #consults decode_token to check the header for valid information
        if decoded_token
            user_id = decoded_token[0]['user_id']
            @user = User.find_by(id: user_id)
        end
    end

    def logged_in?
        #returns true or false
        !!logged_in_user
    end

    def authorized
        #consults logged_in? see see if user is authorized
        render json: { message: 'Please log in' }, status: :unauthorized unless logged_in?
    end
end

Конечно, я бы хотите специально отсортировать эту ошибку (синтаксическая ошибка?), но не знаете, как решать общие ошибки (помимо кодов состояния) в Rails API. Есть ли хорошая практика, которой я должен следовать?

Спасибо!

1 Ответ

1 голос
/ 11 июля 2020

Для 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...