【问题标题】:Rails Exception HandlingRails 异常处理
【发布时间】:2010-06-27 19:21:46
【问题描述】:

如何将模型代码中发生的错误消息发送回视图。我是说。我有一个

begin
       Some code
rescue
       Exception Handling
end

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

【问题讨论】:

    标签: ruby-on-rails exception-handling


    【解决方案1】:

    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

    【讨论】:

    • 但要避免拯救 Exception,因为它是 Ruby 中最通用的异常类型,请参阅此处为什么这是一个不好的做法:stackoverflow.com/questions/10048173/…
    • 当然,这只是一个例子——Exception应该小心处理。
    • 但这只会处理Controller中发生的异常。不在视图/助手中。
    • 到@BrunoPeres...这很好,只需执行 StandardError 而不是 Exception
    • 我认为有一个错字:handle_exception 需要将error 作为参数。
    【解决方案2】:

    在保存/创建模型过程中发生的异常

    我使用 ActiveRecord callbacks after_validation、after_validation_on_create 和 before_save(取决于具体情况)来获取任何额外数据并验证所有内容是否已准备好保存。然后,如果有任何问题,我使用add_to_base 将异常存储在errors[:base] 中。这样,视图将像显示任何其他验证错误一样显示错误消息。

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

    其他模型方法的例外情况

    所有常用方法都可用:

    1. 引发控制器将捕获的特定异常。异常可以包括视图转换为错误消息的错误号。或者模型可以将 error_num 导出到 error_msg 散列
    2. 返回错误代码作为方法的返回参数。例如,如果您还想在工作正常时使用 Flash 给出肯定的消息,您可以返回一个 msg_code。然后有错误的负面消息代码和不同类型的成功的正面代码。
    3. 建立一个@error(或其他)实例变量以供调用者检查。

    【讨论】:

    • 鉴于 OP 的问题,我不确定他们是否会理解您的 #3。史蒂夫,我认为拉里对 3 的含义是在类定义中添加类似 attr_reader :error 的内容,将其分配给错误,从而允许调用者检索它。但我认为他的 #2 可能是最容易实现的。
    【解决方案3】:

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

    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
    

    结束

    这有帮助吗?

    【讨论】:

      【解决方案4】:
      begin
             Some code
      rescue =>e
             @error= e.message
             Exception Handling
      end
      

      在视图中

      <%= @error %>
      

      【讨论】:

      • 注意:此示例仅在第一个代码段位于控制器中时才有效。如果它在模型中,它将不起作用。
      【解决方案5】:
      begin
        some code
      rescue StandardError => ex      
        flash[:error] = "#{ex}"
        render :index
      end
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多