Подтвердить что ты не робот

Обработка исключений Rails

Как я могу отправить сообщения об ошибках, которые происходят в коде модели, обратно в представление. Я имею в виду. У меня есть

begin
       Some code
rescue
       Exception Handling
end

теперь возникает ошибка и в спасении я хотел бы отправить сообщение обратно контроллеру, чтобы он отображался в представлении. Должен ли я использовать переменную, которая должна содержать несколько сообщений об ошибках, которые возникают в одном запросе, объединить их и отправить обратно контроллеру, чтобы я мог отображать его в представлении?. Rails уже показывает некоторые сообщения об ошибках, такие как поле не может быть пустым. Я спрашиваю о других исключениях, которые возникают в функциях, присутствующих в коде модели.

4b9b3361

Ответ 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 и т.д.