Rails在渲染后退出控制器

时间:2012-11-11 16:57:46

标签: ruby-on-rails controller

我的控制器中有一个动作,我遇到了麻烦。这是我的第一个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的记录时正常恢复。这是做这样事的正确方法吗?

2 个答案:

答案 0 :(得分:16)

喜欢@ user1022209说,你可以添加return to exit action:

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

答案 1 :(得分:8)

只需在return;之后添加render即可退出方法正文:)

我认为render只是一个方法调用,你可以调用它,并且该方法将放在堆栈顶部,该堆栈保存方法的执行顺序。完成render后,您将返回remove方法并继续执行剩余的工作。但您可以通过手动退出remove方法

来避免此问题

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