有下面的代码:如何正确捕获控制器操作中的异常?
def index
@posts = User.find_by(login: params[:user_id]).posts
end
正如你可以看到这个代码可以生成异常,如果有一些登录(零指针异常)的用户。我怎样才能捕捉到这个异常并正确处理它?我知道如何在Ruby中捕捉异常,但我想知道如何以良好的Rails风格来做。在不同的控制器中可能会出现同样的问题 - 可能是我应该创建一个动作包装器,捕获异常并呈现500错误?
有下面的代码:如何正确捕获控制器操作中的异常?
def index
@posts = User.find_by(login: params[:user_id]).posts
end
正如你可以看到这个代码可以生成异常,如果有一些登录(零指针异常)的用户。我怎样才能捕捉到这个异常并正确处理它?我知道如何在Ruby中捕捉异常,但我想知道如何以良好的Rails风格来做。在不同的控制器中可能会出现同样的问题 - 可能是我应该创建一个动作包装器,捕获异常并呈现500错误?
最简单的方法是使用的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
def index
@posts = User.find_by!(login: params[:user_id]).posts
rescue ActiveRecord::RecordNotFound => error
# handle user not found case
end
您还可以,如果你想在全球范围内捕获错误的控制器使用rescue_from
http://edgeapi.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html。
您可以使用['rescue_from'(http://edgeapi.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html) – 2014-12-08 09:01:00
好Rails风格不允许异常(至少那一个)被提出。所以你可以使用任何一种形式:'posts = User.where(login:params [:user_id])。first.try(:posts)' – 2014-12-08 09:15:13
集成异常或其他什么?这应该在BaseController中完成,还是应该将每个操作都包装在try-catch块中(rails begin - rescue)? – Miknash 2014-12-08 09:20:36