2016-01-21 129 views
0

有关于开始,救援,确保的快速问题。看看下面的代码,例如:无论开始..救援..救援..确保只有错误?

begin 
    user = User.new 

    # Do stuff with User 

    user.save if user.valid? 

    # Do other stuff here... 

    # ## Error happens here after user has already been saved. ## 

    render text: "Success", status: :ok 
rescue MyExceptions::MySpecialError => e 
    # Do something special here for an error 
    # Output errors the user has power to fix themselves 
    render text: "You messed up!", status: :bad_request 
rescue => e 
    # Do something special here for an error the user can't fix 
    render text: "Internal Error! See support!", status: :unprocessed_entity 
ensure 
    # If user was created, destroy them 
    user.destroy 
end 

确保运行。如果发生错误或没有。有没有办法只有在发生错误时才运行user.destroy(或确保)?

在此先感谢!

+0

只需将'user.destroy'放入'rescue'块。旁注:既然是Rails,你可能需要使用'ActiveRecord :: Base.transaction' –

+0

因此,我必须将user.destroy放在两个救援块中?试着让它干一点。我继续使用这种情况下的交易,但只是解释引用的目的... – Sean

+0

相同[HEAR](http://stackoverflow.com/questions/2191632/begin-rescue-and-ensure-in-ruby) –

回答

0

无论错误与否,都会执行ensure中的代码,这实际上是使用它的好处。

在您的具体情况下,您可以将user.destroy移动到rescue之内,只有在发生错误时它才会运行。