作者:马振亚

问题发现

  • 在实际写rails的controller时,一般在controller的最后总是会render一个json供不同的前端使用,当我们一个controller的逻辑在一个方法中写完时,总是能比较轻松的保证一个controller里面有一次render.
  • 但是大多数情况下我们controller需要对用户进行比较多的验证,验证是否具有某种特殊的权限,如果验证失败返回统一的错误json信息(比如没有社长权限等),这种情况下一般会采用单独将验证的代码放置到前置的验证函数中去.
  • 在这个过程中我发现了一个比较棘手的问题,就是在验证失败的时候前面的验证函数会render失败信息,但是返回到主函数之后代码段会继续执行下去,在执行的过程中很容易出现异常或者是再次render一个新的json造成多重render错误.
  • 希望找到一种方法在第一次render之后就能退出避免相关的异常和错误的发生.

方案1 extracted_method and return(父函数and return法)

class Controller
def show
verify_order and return
# even more code over there ...
end private def verify_order
unless @order.awaiting_payment? || @order.failed?
redirect_to edit_order_path(@order) and return true
end if invalid_order?
redirect_to tickets_path(@order) and return true
end
end
end

这个方法有自身的一些局限性,就是需要在每一个

方案2 子函数yield,父函数调用后{return}

class Controller
def show
verify_order{ return }
# even more code over there ...
end private def verify_order
unless @order.awaiting_payment? || @order.failed?
redirect_to edit_order_path(@order) and yield
end if invalid_order?
redirect_to tickets_path(@order) and yield
end
end
end

方法需要子函数的每一个render或者重定向点加上yield.

方案3 extracted_method; return if performed?

class Controller
def show
verify_order; return if performed?
# even more code over there ...
end private def verify_order
unless @order.awaiting_payment? || @order.failed?
redirect_to edit_order_path(@order) and return
end if invalid_order?
redirect_to tickets_path(@order) and return
end
end
end

最新文章

  1. mui 手势事件配置
  2. 极其简单的搭建eclipse的android开发环境
  3. 【PHP面向对象(OOP)编程入门教程】3.什么是面向对象编程呢?
  4. Android Facebook和Twitter分享
  5. linux 历史命令用法(转)
  6. c#中如何跨线程调用windows窗体控件?
  7. phpstudy 安装memcached服务和memcache扩展
  8. 【ASP.NET MVC系列】数据验证和注解
  9. CF 246E. Blood Cousins Return [dsu on tree STL]
  10. 不要使用jQuery触发原生事件
  11. SpringMVC 全局异常处理
  12. js-cookie的用法
  13. python学习笔记之三-计算运行时间
  14. MySQL5.7 忘记root密码,怎么破?
  15. mongodb副本集修改配置问题
  16. Git for Windows之使用SSH协议开通公钥免密登陆功能
  17. SqlServer Case when then用法总结
  18. MECE分析法(Mutually Exclusive Collectively Exhaustive)
  19. go语言之进阶篇recover的使用
  20. a 样式重置 常见用法

热门文章

  1. (一)类型转换 is 和 as
  2. 9.Javascript原生瀑布流
  3. vue动画理解,进入、离开、列表过度和路由切换。
  4. [转] Cache 和 Buffer的区别
  5. Java检查字符串是否包含中文字符
  6. Java 获取网络重定向URL(302重定向)
  7. 关于控制Broker端入站连接数的讨论
  8. MySql操作命令创建学生管理系统
  9. Odoo销售模块
  10. linux下activemq安装与配置activemq-5.15.2