2014-12-08 58 views
8

有下面的代码:如何正确捕获控制器操作中的异常?

def index 
    @posts = User.find_by(login: params[:user_id]).posts 
end 

正如你可以看到这个代码可以生成异常,如果有一些登录(零指针异常)的用户。我怎样才能捕捉到这个异常并正确处理它?我知道如何在Ruby中捕捉异常,但我想知道如何以良好的Rails风格来做。在不同的控制器中可能会出现同样的问题 - 可能是我应该创建一个动作包装器,捕获异常并呈现500错误?

+1

您可以使用['rescue_from'(http://edgeapi.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html) – 2014-12-08 09:01:00

+1

好Rails风格不允许异常(至少那一个)被提出。所以你可以使用任何一种形式:'posts = User.where(login:params [:user_id])。first.try(:posts)' – 2014-12-08 09:15:13

+1

集成异常或其他什么?这应该在BaseController中完成,还是应该将每个操作都包装在try-catch块中(rails begin - rescue)? – Miknash 2014-12-08 09:20:36

回答

8

最简单的方法是使用的ApplicationController的rescue_from

class ApplicationController < ActionController::Base 
    rescue_from ActiveRecord::RecordNotFound, with: :record_not_found 

    private 

    def record_not_found 
    render 'my/custom/template', status: 404 
    end 
end