Рефакторинг дубликатов обработчиков исключений спасения в контроллере Ruby on Rails - PullRequest
0 голосов
/ 24 октября 2018

У меня есть два метода действия внутри контроллера, которые имеют одинаковый дублированный код, который спасает два разных типа исключений:

      def wave
        ...do something here...
      rescue ActionController::ParameterMissing => e
        render :json => {:error => e.message}, :status => 422
      rescue Vendor::ApiError => e
        render :json => {:error => e.message}, :status => 500
      end

      def run
        ...do something different here...
      rescue ActionController::ParameterMissing => e
        render :json => {:error => e.message}, :status => 422
      rescue Vendor::ApiError => e
        render :json => {:error => e.message}, :status => 500
      end

Могут ли обработчики спасения просто быть реорганизованы в общий частный метод и вызваныиз обоих методов run и wave?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вы можете использовать rescue_from в вашем контроллере, чтобы спасти от ошибки во всех действиях вашего контроллера.У вас может быть что-то вроде этого

class MyController < ApplicationController
  rescue_from ActionController::ParameterMissing do |exception|
    render :json => {:error => exception.message}, :status => 422
  end

  rescue_from Vendor::ApiError do |exception|
    render :json => {:error => exception.message}, :status => 500
  end

  def wave
    # ...
  end

  # ...
end

Вы даже можете поместить его в свой Application Controller, если хотите, чтобы такое поведение было на всех контроллерах (например, может быть полезно для устранения ошибок ParameterMissing)

0 голосов
/ 24 октября 2018

Вы можете попробовать что-то вроде этого:

def wave
  error_handler do
    # ...do something here...
  end
end

def run
  error_handler do
    # ...do something different here...
  end
end

def error_handler
  yield
rescue ActionController::ParameterMissing => e
  render :json => {:error => e.message}, :status => 422
rescue Vendor::ApiError => e
  render :json => {:error => e.message}, :status => 500
end

edit: Это просто с точки зрения рубина, хотя, возможно, у рельсов уже есть что-то лучшее.

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