Обработка исключений Rails
Как я могу отправить сообщения об ошибках, которые происходят в коде модели, обратно в представление. Я имею в виду. У меня есть
begin
Some code
rescue
Exception Handling
end
теперь возникает ошибка и в спасении я хотел бы отправить сообщение обратно контроллеру, чтобы он отображался в представлении. Должен ли я использовать переменную, которая должна содержать несколько сообщений об ошибках, которые возникают в одном запросе, объединить их и отправить обратно контроллеру, чтобы я мог отображать его в представлении?. Rails уже показывает некоторые сообщения об ошибках, такие как поле не может быть пустым. Я спрашиваю о других исключениях, которые возникают в функциях, присутствующих в коде модели.
Ответы
Ответ 1
Исключения, которые происходят как часть сохранения/создания модели
Я использую ActiveRecord callbacks after_validation, after_validation_on_create и before_save (в зависимости от обстоятельств), чтобы получить любые дополнительные данные и убедиться, что все готово к спасению. Затем, если какие-либо проблемы, я сохраняю исключение в ошибках [: base], используя add_to_base. Таким образом, представление отобразит сообщение об ошибке msg так же, как оно отображает любые другие ошибки проверки.
Помните, что если ваш метод before_save возвращает значение false, сохранение не будет выполнено.
Исключения для других методов модели
Доступны все обычные методы:
- Поднимите конкретное исключение, которое будет улавливать контроллер. Исключение может включать номер ошибки, который вид переводит на сообщение об ошибке. Или модель может экспортировать error_num в хэш error_msg
- Возвращает код ошибки в качестве возвращаемого параметра метода. Например, если вы хотите также использовать Flash для получения положительного сообщения, когда все работает, вы можете вернуть msg_code. Затем имеют отрицательные коды msg для ошибок и положительных кодов для разных типов успеха.
- Установите переменную экземпляра @error (или любой другой), которая будет проверена вызывающим абонентом.
Ответ 2
Пример того, что я делаю в своем собственном коде:
def create
@letter = Letter.new(params[:id])
begin
@letter.do_something_that_could_throw_an_exception
flash[:notice] = I18n.translate('letter.success_create')
rescue => e
logger.error "letter_controller::create => exception #{e.class.name} : #{e.message}"
flash[:error] = "#{I18n.translate('letter.letter_create_failed')}<br/>Detailed error: #{e.message}"
ExceptionNotifier.deliver_exception_notification(e, self, request)
# redirect somewhere sensible?
end
end
конец
Помогает ли это?
Ответ 3
begin
Some code
rescue =>e
@error= e.message
Exception Handling
end
в представлениях
<%= @error %>
Ответ 4
begin
some code
rescue StandardError => ex
flash[:error] = "#{ex}"
render :index
end
Ответ 5
Установить обработчик исключений в ApplicationController
class ApplicationController < ActionController::Base
rescue_from Exception, :with => :handle_exception
def handle_exception
flash[:error] = error.message
redirect_to request.referer || root_path
end
end
Это общий пример, вы можете указать типы исключений, например. rescue_from ActiveRecord::RecordNotFound, ActiveRecord::RecordInvalid
и т.д.