2012-11-11 14 views
7

Mam działanie w moim kontrolerze, z którym mam problem. To jest moja pierwsza aplikacja dla railsów, więc nie jestem pewien najlepszych praktyk związanych z szynami.Sterownik wyjścia Rails po renderowaniu

Mam model o nazwie Group i kilka akcji, które wchodzą w jego kontroler. Napisałem test, który powinien spowodować, że kontroler wygeneruje błąd w JSON z powodu nieprawidłowego identyfikatora grupy. Zamiast renderowania i wychodzenia, wygląda na to, że kontroler renderuje i kontynuuje wykonywanie.

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 działanie

# 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 

W regulatorze, pierwszy if wykonuje: render :json => { :message => "group_id not found" } ale @group.destroy jest nadal wykonywany. Wydaje mi się to sprzeczne z intuicją, sądzę, że metoda renderowania powinna wyjść z kontrolera.

Dlaczego kontroler nie kończy pracy po wywołaniu render?

Celem tego bloku kodu jest odzyskanie z wdziękiem, gdy nie można znaleźć rekordu z przekazanym identyfikatorem. Czy to jest właściwy sposób robienia czegoś takiego?

Odpowiedz

15

Jak @ user1022209 powiedział, można dodać zwrot, aby zakończyć działanie:

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

O kodzie, myślę, że byłoby napisać tak:

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

Doskonały. Dodanie zwrotu działało świetnie. – codysehl

7

Wystarczy po prostu dodać return; po render aby opuścić ciało metody :)

myślę render jest tylko wywołanie metody, to nazwać, a metoda zostanie umieszczona na szczycie stosu, który posiada sekwencję wykonanie metody. Po zakończeniu render powróć do metody remove i kontynuuj wykonywanie pozostałych. Ale można uniknąć tego problemu poprzez ręczne wyjść z remove metoda

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

Powiązane problemy