2015-01-14 3 views
4

У меня есть приложение в rails, которое может отвечать как json, так и html.
Я хотел бы, что, когда запись возвращает ошибку при сохранении, то JSON ответ так:`rescue_from` исключение, только если формат json

{ 
    "errors" : { 
    "slug" : [ 
     "can't be blank" 
    ], 
    "title" : [ 
     "can't be blank" 
    ] 
    } 
} 

Поэтому я добавил этот код в моем ApplicationController классе.

rescue_from ActiveRecord::RecordInvalid do |exception| 
    render json: { errors: exception.record.errors }, 
     status: :unprocessable_entity 
end 

Я хотел бы, что это rescue_from называется только тогда, когда формат JSON, иначе ведут себя стандартным образом (если формат HTML). Как я могу сделать что-то подобное?

UPDATE Я нашел решение, но я не думаю, что это очень хорошо:

rescue_from ActiveRecord::RecordInvalid do |exception| 
    respond_to do |format| 
    format.json do 
     render json: { errors: exception.record.errors }, 
      status: :unprocessable_entity 
    end 
    format.html { fail exception } 
    end 
end 

Есть ли лучший подход?

+1

вместо спасения от этого исключения, вы не должны поднять его в первую очередь. вот для чего нужны '.save' и' .errors'. если вы используете вызов 'response_with', рельсы автоматически возвращают статус' unprocessable_entity' и ошибки как json – phoet

ответ

0

Существует лучший подход.

Например:

rescue_from ActionController::InvalidAuthenticityToken do |exception| 
    raise unless request.xhr? 
    render nothing: true, status: :unprocessable_entity 
    end 
Смежные вопросы