Как обрабатывать ошибки или неудачные запросы в Rails Rails API?

У меня есть приложение Rails, которое включает интерфейс API JSON. Когда значения правильно указаны, контроллер обрабатывает счастливый путь только отлично, а JSON отображается как вывод.

Однако, если есть проблема с входом, возникает исключение, и вместо этого отображаются некоторые шаблоны в rescues. Мне бы очень хотелось вернуть ошибку JSON в строках { "error": { "msg": "bad request", "params": ... } } и соответствующий код состояния HTTP (например, 403, если они не были аутентифицированы). Но я хочу, чтобы это применимо к запросам на что-либо в example.com/api/....

Как я могу это сделать?

Ответ 1

У меня был похожий случай, но я спасал отдельные методы API отдельно, потому что мне нужны ошибки, специфичные для метода, у меня также может быть несколько спасителей в зависимости от типа ошибки.

в моем контроллере приложений, у меня был метод:

def error(status, code, message)
  render :js => {:response_type => "ERROR", :response_code => code, :message => message}.to_json, :status => status
end

Затем в моем контроллере API

def some_method
  ## do stuff
rescue
  error(500, method_specific_error_code, "it all done broke")
  ## additional error notifications here if necessary.
end

потому что я освобождаю ошибку, мне нужно было явно вызвать hoptoad api.

Чтобы обрабатывать аутентификацию, у меня был before_filter для login_required

def login_required
  error(403, 403, "Not Authenticated") unless authenticated
end

И чтобы спасти 404 ошибки:

def render_404
  error(404, 404, "Unknown method")
end

Надеюсь, это поможет!

Ответ 2

Как насчет around_filter на вашем контроллере api. Что-то вроде

around_filter :my_filter

private
def my_filter
  begin
    yield
  rescue
    render :js => ...
  end
end

Ответ 3

def create

    res= 
    RestClient::Request::Execute(params{},headers,success_url,  
failure_url) 

   if res. response_type = 200

       redirect_to success_url

   else

       redirect_to failure_url

   end

end

Если есть какая-либо ошибка, она будет перенаправлена на сбой URL, в противном случае успешный URL