2012-11-11 7 views
7

Ich habe eine Aktion in meinem Controller, mit dem ich Probleme habe. Dies ist meine erste Rails-App, daher bin ich mir der Best Practices für Rails nicht sicher.Schienen beenden Controller nach dem Rendern

Ich habe ein Modell namens Gruppe und ein paar Aktionen, die in seinem Controller gehen. Ich habe einen Test geschrieben, der dazu führen sollte, dass der Controller aufgrund einer ungültigen Gruppen-ID einen Fehler in JSON rendert. Anstatt zu rendern und zu beenden, sieht es so aus, als würde der Controller rendern und weiter ausführen.

-Test

test 'should not remove group because of invalid group id' do 
    post(:remove, {'group_id' => '3333'}) 
    response = JSON.parse(@response.body) 
    assert_response :success 
    assert_equal 'Success', response['message'] 
end 

Controller-Aktion

# Post remove 
# group_id 
def remove 
    if((@group = Group.find_by_id(params[:group_id])) == nil) 
     render :json => { :message => "group_id not found" } 
    end 

    @group.destroy 
    if(!Group.exists?(@group)) 
     render :json => { :message => "Success" } 
    else 
     render :json => { :errors => @group.errors.full_messages } 
    end 
end 

In der Steuerung, die erste if-Anweisung ausführt: render :json => { :message => "group_id not found" } aber @group.destroy noch ausgeführt werden wird. Das scheint mir nicht intuitiv zu sein, ich würde denken, dass die Rendermethode den Controller verlassen sollte.

Warum wird die Steuerung nicht beendet, nachdem render aufgerufen wurde?

Der Zweck dieses Codeblocks besteht darin, ordnungsgemäß wiederherzustellen, wenn kein Datensatz mit der übergebenen ID gefunden werden kann. Ist das der richtige Weg, so etwas zu tun?

Antwort

15

Wie @ user1022209 sagte, können Sie Rückkehr hinzufügen Aktion beenden:

render(:json => { :message => "group_id not found" }) and return 

Über den Code, ich glaube, ich würde schreiben wie folgt:

def remove 
    if(!Group.exists?(params[:group_id]) 
    render :json => { :message => "group_id not found" } 
    else 
    @group = Group.find(params[:group_id] 
    @group.destroy 
    if @group.destroyed? 
     render :json => { :message => "Success" } 
    else 
     render :json => { :errors => @group.errors.full_messages } 
    end 
    end 
end 
+0

Ausgezeichnet. Hinzufügen einer Rendite hat super funktioniert. – codysehl

7

Einfach nur return; nach render fügen Sie die Methode Körper :)

Ich denke, render ist nur eine Methode Anruf zu beenden, Sie nennen es, und das Verfahren wird oben auf den Stapel gelegt werden, die die Sequenz hält von Ausführung der Methode. Nachdem Sie render beendet haben, gehen Sie zurück zur remove Methode und fahren fort, die restlichen auszuführen. Aber Sie können dieses Problem vermeiden, indem Sie manuell beenden die remove Methode

It is my drawing to illustrate the concept described by the words above

Verwandte Themen