2012-11-11 155 views
7

我在我的控制器中有一個操作,我遇到了麻煩。這是我的第一個rails應用程序,所以我不確定圍繞rails的最佳實踐。渲染後導軌退出控制器

我有一個模型叫集團和一些行動,在它的控制器。 我寫了一個測試,應該會導致控制器由於無效的組ID而在JSON中顯示錯誤。而不是渲染和退出,它看起來像控制器正在渲染並繼續執行。

測試

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 

控制器動作

# 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 

在控制器中,if語句執行第一:render :json => { :message => "group_id not found" }@group.destroy仍在執行。這對我來說似乎是反直覺的,我會認爲渲染方法應該退出控制器。

爲什麼在調用render後控制器不能退出?

的代碼塊的目的是爲了正常恢復時沒有記錄可以與ID傳遞的被發現。這是做這種事的正確方法嗎?

回答

15

像@ user1022209說,你可以添加return退出動作:

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

關於你的代碼,我想我會寫像這樣:

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

優秀。添加一個回報效果很好。 – codysehl

7

只需在render後添加return;退出方法體:)

我覺得render只是一個方法調用,你怎麼稱呼它,並且該方法將被放置在其持有的序列棧頂該方法的執行。完成render後,你回到remove方法,並繼續執行剩餘。但是,就可以避免這個問題,通過手動退出remove方法

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