ruby-on-rails – 渲染后Rails退出控制器

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 渲染后Rails退出控制器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的控制器中有一个动作,我遇到了麻烦.这是我的第一个rails应用程序,所以我不确定有关rails的最佳实践.

我有一个名为Group的模型和一些进入它控制器的动作.
我编写了一个测试,该测试应该导致控制器因为组ID无效而在JSON中呈现错误.它不是渲染和退出,而是看起来控制器正在渲染并继续执行.

测试

  1. test 'should not remove group because of invalid group id' do
  2. post(:remove,{'group_id' => '3333'})
  3. response = JSON.parse(@response.body)
  4. assert_response :success
  5. assert_equal 'Success',response['message']
  6. end

控制器动作

  1. # Post remove
  2. # group_id
  3. def remove
  4. if((@group = Group.find_by_id(params[:group_id])) == nil)
  5. render :json => { :message => "group_id not found" }
  6. end
  7.  
  8. @group.destroy
  9. if(!Group.exists?(@group))
  10. render :json => { :message => "Success" }
  11. else
  12. render :json => { :errors => @group.errors.full_messages }
  13. end
  14. end

在控制器中,第一个if语句执行:render:json => {:message => “找不到group_id”}
但@ group.destroy仍在执行中.这对我来说似乎是违反直觉的,我认为渲染方法应该退出控制器.

调用渲染后控制器为什么不退出

这段代码的目的是在没有找到传入ID的记录时正常恢复.这是做这样事的正确方法吗?

解决方法

就像@ user1022209所说,你可以添加返回退出动作:
  1. render(:json => { :message => "group_id not found" }) and return

关于你的代码,我想我会这样写:

  1. def remove
  2. if(!Group.exists?(params[:group_id])
  3. render :json => { :message => "group_id not found" }
  4. else
  5. @group = Group.find(params[:group_id]
  6. @group.destroy
  7. if @group.destroyed?
  8. render :json => { :message => "Success" }
  9. else
  10. render :json => { :errors => @group.errors.full_messages }
  11. end
  12. end
  13. end

猜你在找的Ruby相关文章