Rails 异常处理

17

我该如何将模型代码中出现的错误消息发送回视图?我的意思是,我有一个

begin
       Some code
rescue
       Exception Handling
end

现在发生了错误,在救援过程中,我想向控制器发送一条消息,以便在视图中显示。我需要使用一个变量吗,其中必须包含在一个请求中发生的许多错误消息,并将它们连接起来发送回控制器,以便我可以在视图中显示它们?Rails已经显示了一些错误消息,例如"字段不能为空"。我问的是关于在模型代码中存在的函数中发生的其他异常。

5个回答

13

我在自己的代码中所做的示例:

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

结束

这有帮助吗?


7
begin
       Some code
rescue =>e
       @error= e.message
       Exception Handling
end

在视图中

<%= @error %>

注意:仅当第一个代码段在控制器中时,此示例才有效。如果它在模型中,则无法工作。 - Larry K

7

保存/创建模型时发生的异常

我使用ActiveRecord 回调函数 after_validation、after_validation_on_create 和 before_save(根据情况而定),获取任何额外的数据并验证一切是否准备好保存。然后,如果有任何问题,我使用add_to_base将异常存储在errors[:base]中。这样视图将以与显示任何其他验证错误相同的方式显示错误消息。

请记住,如果before_save方法返回false,则保存将失败。

其他模型方法的异常

所有通常的方法都可用:

  1. 引发特定的异常,控制器会捕获。异常可以包括错误编号,视图将其翻译为错误消息。或者模型可以导出错误编号到错误消息哈希表。
  2. 作为方法的返回参数返回错误代码。例如,如果您还想使用Flash在事情正常时给出积极的消息,您可以返回一个msg_code。然后对于错误使用负的msg_codes,对于不同类型的成功使用正的代码。
  3. 建立一个@error(或其他)实例变量供调用者检查。

1
鉴于提问者的问题,我不确定他们是否能理解你的第三点。Steve,我认为Larry在第三点上的意思是在类定义中添加类似 attr_reader :error 的内容,然后在出错时进行赋值,从而允许调用者获取错误信息。但我认为他的第二点可能是最容易实现的。 - adriandz

5

ApplicationController中设置异常处理程序

class ApplicationController < ActionController::Base

  rescue_from Exception, :with => :handle_exception

  def handle_exception(error)
    flash[:error] = error.message
    redirect_to request.referer || root_path
  end
end

这是一个通用的例子,你可以指定异常的类型,例如: rescue_from ActiveRecord::RecordNotFound, ActiveRecord::RecordInvalid 等等。


1
但是要避免救援Exception,因为它是Ruby中最通用的异常类型。在这里可以看到为什么这是一种不好的做法:https://dev59.com/R2kw5IYBdhLWcg3wNn-h - Bruno Peres
当然,这只是一个例子 - Exception 应该非常小心地处理。 - Haris Krajina
但是这只能处理在控制器中发生的异常,而不能处理视图/助手中的异常。 - Nishutosh Sharma
针对@BrunoPeres的建议,这很好,只需使用StandardError而不是Exception即可。 - Sabrina Leggett
1
我认为有一个打字错误:handle_exception需要将error作为参数传入。 - Motine

3
begin
  some code
rescue StandardError => ex      
  flash[:error] = "#{ex}"
  render :index
end

1
但是要避免救援Exception,因为它是Ruby中最通用的异常类型。在这里可以看到为什么这是一种不好的做法:https://dev59.com/R2kw5IYBdhLWcg3wNn-h - Bruno Peres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接