【问题标题】:Catch all exceptions in rails controller's before_action在 Rails 控制器的 before_action 中捕获所有异常
【发布时间】:2014-05-21 08:03:22
【问题描述】:

albums_controller.rb:

lass AlbumsController < ApplicationController
  before_action :set_album, only: [:show, :edit, :update, :destroy]

  def destroy
    if @album.destroy
      redirect_to albums_url, notice: 'Album was successfully destroyed.'
    else
      redirect_to albums_url, error: 'Album destroy failed.' # _DEST_
    end
  end

 private
    def set_album
      @album = Album.find(params[:id]) # _FIND_
    end
end

我想捕获 Album.find() 的异常。根据this 我补充说:

  rescue_from Exception, with: :flash_error

  # private
  def flash_error
      flash_message :error, 'Something went wrong..' # _FLASH_
  end

我将上面的一些部分标记为_FIND__FLASH__DEST_,我想按顺序浏览所有这些部分。我试图删除不存在的专辑来触发它。我得到了带有专辑 URL 的空白页面/(:id)(我试图删除的那个),所以我想我停留在 _FLASH_ 部分。

我应该怎么做才能调用destroy 操作(我的意思是原来的调用为rescue_form,因为它也可以捕获其他控制器操作的其他异常)。以及如何获得比Something went wrong 更好的消息?

主要目标是重定向到正确的页面(在_DEST_ 指定),所以也许有一些更好的方法。

【问题讨论】:

  • 尝试使用rescue_from ActiveRecord::RecordNotFound, with: :rescue_action
  • 变化不大,还是没有继续_DEST_

标签: ruby-on-rails


【解决方案1】:

“rescue_from”回调方法“flash_error”的行为就像一个普通的控制器操作,从用户的角度来看,它最终会呈现空白页面。从这个意义上说,它并没有被困在那里,而是在那里完成。

为了“继续”,您需要重定向或渲染。请注意,异常会被传播,因此您可以获得有关所发生情况的更多详细信息:

 #I am using Rails 3.2 flash notation
 def flash_error(exception)
    flash[:error] = "#{exception.message} (Something went wrong..)" # _FLASH_
    redirect_to albums_url
 end

我的建议是永远不要捕获所有异常。以我的经验,除了悲伤之外,什么也没有。想象一下,如果您在索引操作中遇到异常 - 最终会陷入循环。

【讨论】:

  • 听起来不错,但由于我有多个调用set_album 的操作(您可以在before_action 看到)并且对于每个操作我都有不同的redirect_to 目的地,所以我不能只放一个@ 987654326@flash_error。有没有办法检查调用了什么主要动作?我可以从 flash_error 中回忆它,或者用case 在那里创建多个redirect_to
  • 您可以在 exception.backtrace 中获得一些信息,但我不确定如果发生异常情况,您为什么要进行自定义操作。如果我想显示动作但没有找到专辑,恢复方案是什么?
  • 我重新考虑了整个事情,你是对的。首先,它是特殊的,所以它不应该经常发生。其次,我将在未来转向 ajax,这样就不需要页面重定向或重新渲染来为用户显示一条 Flash 消息。如果您可以查看another question,我将不胜感激。
猜你喜欢
  • 2011-04-11
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多