2016-11-30 6 views
0

Ist dies der richtige Weg, um eine Rettung in einem Block zu tun?Der beste Weg, um einen Rettungsblock zu machen

Ist es auch der kürzeste?

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 

Antwort

1

Die Idee beginnen zu verwenden, Rettung, sicherzustellen, dass die Methoden zu setzen, als ein Fehler in dem begin Block erzeugen kann, dann können Sie die Fehler in einem o mehr rescue Blöcke behandeln und schließlich können Sie ein optionale setzen ensure Blockieren Sie Sätze, die Sie sowohl bei Erfolgs- als auch bei Fehlerszenarien ausführen möchten, z. B. bei Release-Ressourcen.

Wenn Sie möchten, dass die gesamte Methode behandelt werden von beginnen, retten, stellen Sie sicher Blöcke, dann begin Schlüsselwort ist optional, können Sie verwenden oder nicht das Schlüsselwort, da Sie für die kürzeste Option fragen, müssen Sie einige kleinere tun Änderungen an Ihrem Code:

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 

Wenn Sie es noch kürzer Sie mehrere Ausnahmetypen in einem Rettungsblock retten kann:

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

Danke für Ihre Antwort, ich werde Ihren Vorschlägen folgen. Außerdem wiederhole ich 'redirect_to: back, error: e.message_to_purchaser' in 3 Rettungen. Gibt es einen kürzesten Weg dazu? – Bengala

+0

@Bengala Wenn dies die richtige Antwort ist, sollten Sie es akzeptieren. – mysmallidea

+0

Ich mache keine richtige Antwort, da wir 3 mal "redirect_to: back, error: e.message_to_purchaser" wiederholen. Ich bin mir sicher, dass es kürzer sein könnte. – Bengala

0

Aguars Beitrag der aktuellen Implementierung behandelt. Wenn Sie alle Fehler auf die gleiche Weise behandeln, können Sie sie von einer benutzerdefinierten Klasse erben und sie alle mit einem Rettungsruf abfangen.

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 
Verwandte Themen