博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[技术博客] 如何避免在代码中多重render
阅读量:4605 次
发布时间:2019-06-09

本文共 1605 字,大约阅读时间需要 5 分钟。

目录

作者:

问题发现

  • 在实际写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  endend

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

方案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  endend

方法需要子函数的每一个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  endend

转载于:https://www.cnblogs.com/buaareadsun/p/10881816.html

你可能感兴趣的文章
cf C On Number of Decompositions into Multipliers
查看>>
Tiling
查看>>
教你一招 - 如何安装nopcommerce2.5
查看>>
Oracle Statistic 统计信息 小结(转载)
查看>>
C#特性-表达式树
查看>>
分享一个JQ对listbox进行排序的脚本
查看>>
poj3278Catch That Cow(BFS)
查看>>
第十一章 认识与学习BASH
查看>>
基于Andoird 4.2.2的Account Manager源代码分析学习:创建选定类型的系统帐号
查看>>
使用Hexo搭建个人博客并部署到GitHub或码云上全过程
查看>>
[软件]Xcode查找系统framework所在路径
查看>>
海量数据系统对比
查看>>
典型用户和用户场景描述
查看>>
搭建企业级网络共享服务(FTP,NFS,Samba)
查看>>
使用docker redis主从集群
查看>>
DES+MD5加密
查看>>
exam help
查看>>
BZOJ 1449: [JSOI2009]球队收益 最小费用最大流 网络流
查看>>
canvas@Bitmap
查看>>
css背景图
查看>>