2012-11-11 93 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