cod*_*ehl 7 controller ruby-on-rails
我的控制器中有一个动作,我遇到了麻烦.这是我的第一个rails应用程序,所以我不确定有关rails的最佳实践.
我有一个名为Group的模型和一些控制器中的动作.我编写了一个测试,该测试应该导致控制器因为组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
Run Code Online (Sandbox Code Playgroud)
控制器动作
# 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
Run Code Online (Sandbox Code Playgroud)
在控制器中,第一个if语句执行:render :json => { :message => "group_id not found" }
但@group.destroy仍在执行中.这对我来说似乎是违反直觉的,我认为渲染方法应该退出控制器.
render调用后为什么控制器没有退出?
这段代码的目的是在没有找到传入ID的记录时正常恢复.这是做这样事的正确方法吗?
Tha*_*anh 16
比如@ user1022209说,你可以添加return to exit action:
render(:json => { :message => "group_id not found" }) and return
Run Code Online (Sandbox Code Playgroud)
关于你的代码,我想我会这样写:
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
Run Code Online (Sandbox Code Playgroud)
只需简单地添加return;后render退出方法体:)
我认为render只是一个方法调用,你调用它,并且该方法将放在堆栈的顶部,该堆栈保存方法的执行顺序.完成后render,返回到该remove方法并继续执行剩余的方法.但您可以通过手动退出remove方法来避免此问题

| 归档时间: |
|
| 查看次数: |
11370 次 |
| 最近记录: |