[技术博客] 如何避免在代码中多重render
作者:马振亚
问题发现
- 在实际写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
[技术博客] 如何避免在代码中多重render的更多相关文章
- 【技术博客】 关于laravel5.1中文件上传测试的若干尝试
关于laravel5.1中文件上传测试的若干尝试 作者:ZGJ 版本:v1.0 PM注:本人这两天也正在尝试解决这一问题,如有进展将及时更新这一博客 在我们的软工第二阶段中,我开始着手进行后端控制器的 ...
- [技术博客]微信小程序开发中遇到的两个问题的解决
IDE介绍 微信web开发者工具 前端语言 微信小程序使用的语言为wxml和wss,使用JSON以及js逻辑进行页面之间的交互.与网页的html和css略有不同,微信小程序在此基础上添加了自己的改进, ...
- C++中实现对map按照value值进行排序 - 菜鸟变身记 - 51CTO技术博客
C++中实现对map按照value值进行排序 - 菜鸟变身记 - 51CTO技术博客 C++中实现对map按照value值进行排序 2012-03-15 15:32:36 标签:map 职场 休闲 排 ...
- 【技术博客】JWT的认证机制Django项目中应用
开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. JWT的认证机制Django项目中应用 这篇技术博客基于软 ...
- 【技术博客】Django中文件下载的实现
开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. Django中文件下载的实现 1.背景 在VisualPy ...
- [技术博客] Django中文件的保存与访问
[技术博客] Django中文件的保存与访问 在TextMarking项目开发中,数据库需要保存用户上传的文本文档. 原型设计:用户点击上传文本->保存文本->文本发送到后端保存为文件. ...
- 如何写出高质量的技术博客 这边文章出自http://www.jianshu.com/p/ae9ab21a5730 觉得不错直接拿过来了 好东西要大家分享嘛
如何写出高质量的技术博客?答案是:如果你想,就一定能写出高质量的技术博客.看起来很唯心,但这就是事实.有足够愿力去做一件目标明确,有良好反馈系统的事情往往很简单.就是不停地训练,慢慢地,你自己 ...
- 技术博客(初用markdown)。
技术博客 菜鸟教程在这个网站我学到许多有趣的东西,并且弥补了我之前的一些不足之处. 以下为我学习到的内容 输出不同的三位数 以下为代码和输出结果 *** #include<stdio.h> ...
- 技术博客(初用markdown)
技术博客 菜鸟教程在这个网站我学到许多有趣的东西,并且弥补了我之前的一些不足之处. 以下为我学习到的内容. 1 如果想输出多个多位数的时候,可以尝试用多个if语句.如果需要输出3为数的时候,设置三个变 ...
随机推荐
- zynq开发板外设配置演示
有幸得到米尔电子zynq系列开发板Z-turn Board试用体验,下面说说我这款zynq系列的Z-TURN板子外设配置.从Z-turn Board原理图上看,目前可以配置的FPGA管脚大概有100多 ...
- Vue项目打包发布后CSS中的背景图片不显示
相信有很多同学在学习vue的刚开始都遇到过项目打包发布后发现CSS中的背景图片不显示,具体如何解决只需要更改bind的配置即可 修改 build/utils.js 中的 generateLoaders ...
- Java 数组(一)定义与访问
一.数组 1.容器概述 容器:是将多个数据存储到一起,每个数据称为该容器的元素. 2.数组概述 数组:数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致. 数组特点: (1)数组是一 ...
- JS案例 - 城市三级联动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- PHP公众号开发给用户发微信消息提醒功能
最近做的一个项目,当有用户有资金到账或者成员变动时需要给他发一条微信消息提示.针对这个,开始想使用模板消息,但是刚注册的公众号申请消息模板需要几天时间申请,在时间不足下选择了使用客服消息接口,微信文档 ...
- Golang: 读写之外的其他文件操作
在上一篇文章中,我们介绍了常用的文件读写操作,今天接着来研究一下,除了读写以外的其他常见文件操作. 一.创建目录: package main import ( "fmt" &quo ...
- 【转】如何把变量或者数组定义到SDRAM及任意位置
我们开发软件的时候,经常会遇到到一个问题,就是内存不够,这个时候就纠结了,怎么办,有两种方法,第一种是扩展内存,外加SRAM或者SDRAM:第二种应该就是优化代码,也就是通常所说的把数组大小减一减,代 ...
- httprunner运行报错问题:base url missed
在httprunner运行报错问题 代码书写: 当此段yml文件运行时会出现一下错误 在出现此错误时,为base_url的格式出现错误,只需修改base_url的位置 修改位置后运行yml文件 运行成 ...
- SAMBA配置文件详解
全局参数: ==================Global Settings =================== [global] config file = /usr/local/samba/ ...
- Jenkins中如何实现debug配置
java -jar -Xmx512m -Dfile.encoding=UTF-8 -server -XX:-OmitStackTraceInFastThrow -server -agentlib:jd ...