可以在Rails控制器中呈现和引发异常吗?

时间:2016-07-19 14:07:37

标签: ruby-on-rails exception-handling render

我现在已经和它斗争了好几个小时了。我有一个控制器动作,我想渲染一个页面,然后自动引发一个异常。我无法找到有关这方面的更多信息,这让我觉得我在寻找错误的东西。

以下是可能的吗?

class UsersController < ActionController::Base

  def new
    # .. do stuff
    begin
      UserMailer::send_confirmation_link(@user)
    rescue StandardError => e
      render 'email_error'
      raise(e)
    end
    # .. other stuff
  end

end

在这种情况下,我只想告知最终用户错误,然后在应用程序本身上引发异常。请注意,我无法更改事实上的错误页面,因为这是一个较小的应用程序,在相同的代码库中有更大的应用程序。

1 个答案:

答案 0 :(得分:2)

不,你要么渲染也要引发异常,而不是两者。

Rails确实提供500.html中的静态public页面,这是默认情况下为异常呈现的内容,您可以自定义用户在那里查看所有例外的消息。

还有rescue_from方法可以用来自定义特定异常类的响应,这是一个很好的方法来获得一个中心点(通常在ApplicationController中),其中异常响应是所有位于。

如果您使用您的用例,您可能需要自己的自定义异常类,即RuntimeError的子类,您可以将此异常包装为重新引发,例如:

rescue StandardError => e
  raise EmailConfirmationError.new e.message
end

...然后在ApplicationController

rescue_from EmailConfirmationError { |e| render "email_error" }