捕获rails控制器的before_action中的所有异常

Catch all exceptions in rails controller's before_action

albums_controller.rb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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()捕获异常。 根据这个,我补充说:

1
2
3
4
5
6
  rescue_from Exception, with: :flash_error

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

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

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

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


"rescue_from"回调方法"flash_error"的行为类似于从用户角度最终呈现空白页面的普通控制器操作。 从那个意义上讲,它并没有停留在那里,而是在那里完成。

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

1
2
3
4
5
 #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

我的建议是永远不要抓住所有例外。 根据我的经验,除了悲伤之外什么都没有。 想象一下,如果你在索引动作中有异常 - 那将最终成为一个循环。