2016-11-30 70 views
0

这是正确的方式来做一个块救援?最好的方法来做一个救援块

另外,它是最短的吗?

def rescue_definition 
    begin 
     user.begin_rescue 
    rescue Example::ParameterValidationError => e 
     redirect_to :back, error: e.message_to_purchaser 
    rescue Example::ProcessingError => e 
     redirect_to :back, error: e.message_to_purchaser 
    rescue Example::Error 
     redirect_to :back, error: e.message_to_purchaser 
    else 
     if user 
      flash['success'] = 'OK' 
     else 
      flash['error'] = 'NO' 
     end 
    end 
    redirect_to :back 
end 

回答

1

的主意,使用开始,营救,确保被放方法,无法在begin块产生一个错误,那么您可以在一个处理错误Ø更rescue块,终于可以把可选ensure阻止您希望在成功或失败场景(例如发布资源)上执行的句子。

当你想要通过开始,救援,确保块来处理所有的方法,那么begin关键字是可选的,你可以使用或不使用关键字,因为你要求最短的选项,你将需要做一些小的改变你的代码:

def rescue_definition 
    user.begin_rescue 
    # and any other stuff you want to execute 
    if user 
    flash['success'] = 'OK' 
    else 
    flash['error'] = 'NO' 
    end 
    redirect_to :back 
rescue Example::ParameterValidationError => e 
    redirect_to :back, error: e.message_to_purchaser 
rescue Example::ProcessingError => e 
    redirect_to :back, error: e.message_to_purchaser 
rescue Example::Error 
    redirect_to :back, error: e.message_to_purchaser 
end 

如果你想让它更短,你可以在一个救援块抢救多种异常:

def rescue_definition 
    user.begin_rescue 
    # and any other stuff you want to execute 
    if user 
    flash['success'] = 'OK' 
    else 
    flash['error'] = 'NO' 
    end 
    redirect_to :back 
rescue Example::ParameterValidationError, Example::ProcessingError, Example::Error => e 
    redirect_to :back, error: e.message_to_purchaser 
end 
+0

感谢您的回答,我会按照您的建议。另外,我在3次救援中重复'redirect_to:back,error:e.message_to_purchaser'。有没有最短的方法来做到这一点? – Bengala

+0

@Bengala如果这是正确的答案,你应该接受它。 – mysmallidea

+0

因为我们重复“redirect_to:back,error:e.message_to_purchaser”3次,所以我不是正确的答案。我相信它可能会更短。 – Bengala

0

Aguar的后处理目前的实现。如果你以同样的方式处理所有的错误,那么你可以让他们从一个自定义的类继承,并且只需要1次救援呼叫就可以抓住它们。

def stuff 
    user.stuff 
    if user 
    flash['success'] = 'Ya' 
    else 
    flash['error'] = 'Nah' 
    end 
    redirect_to .... 
rescue CustomClassError => e 
    redirect_to :back, error: e.message_to_purchaser 
rescue NonCustomErrors => e 
    #handle it 
end