作者:马振亚

问题发现

  • 在实际写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的更多相关文章

  1. 【技术博客】 关于laravel5.1中文件上传测试的若干尝试

    关于laravel5.1中文件上传测试的若干尝试 作者:ZGJ 版本:v1.0 PM注:本人这两天也正在尝试解决这一问题,如有进展将及时更新这一博客 在我们的软工第二阶段中,我开始着手进行后端控制器的 ...

  2. [技术博客]微信小程序开发中遇到的两个问题的解决

    IDE介绍 微信web开发者工具 前端语言 微信小程序使用的语言为wxml和wss,使用JSON以及js逻辑进行页面之间的交互.与网页的html和css略有不同,微信小程序在此基础上添加了自己的改进, ...

  3. C++中实现对map按照value值进行排序 - 菜鸟变身记 - 51CTO技术博客

    C++中实现对map按照value值进行排序 - 菜鸟变身记 - 51CTO技术博客 C++中实现对map按照value值进行排序 2012-03-15 15:32:36 标签:map 职场 休闲 排 ...

  4. 【技术博客】JWT的认证机制Django项目中应用

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. JWT的认证机制Django项目中应用 这篇技术博客基于软 ...

  5. 【技术博客】Django中文件下载的实现

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. Django中文件下载的实现 1.背景 在VisualPy ...

  6. [技术博客] Django中文件的保存与访问

    [技术博客] Django中文件的保存与访问 在TextMarking项目开发中,数据库需要保存用户上传的文本文档. 原型设计:用户点击上传文本->保存文本->文本发送到后端保存为文件. ...

  7. 如何写出高质量的技术博客 这边文章出自http://www.jianshu.com/p/ae9ab21a5730 觉得不错直接拿过来了 好东西要大家分享嘛

        如何写出高质量的技术博客?答案是:如果你想,就一定能写出高质量的技术博客.看起来很唯心,但这就是事实.有足够愿力去做一件目标明确,有良好反馈系统的事情往往很简单.就是不停地训练,慢慢地,你自己 ...

  8. 技术博客(初用markdown)。

    技术博客 菜鸟教程在这个网站我学到许多有趣的东西,并且弥补了我之前的一些不足之处. 以下为我学习到的内容 输出不同的三位数 以下为代码和输出结果 *** #include<stdio.h> ...

  9. 技术博客(初用markdown)

    技术博客 菜鸟教程在这个网站我学到许多有趣的东西,并且弥补了我之前的一些不足之处. 以下为我学习到的内容. 1 如果想输出多个多位数的时候,可以尝试用多个if语句.如果需要输出3为数的时候,设置三个变 ...

随机推荐

  1. react,react-router,redux+react-redux 构建一个React Demo

    创建初始化应用 加速我们的npm. npm install -g cnpm --registry=https://registry.npm.taobao.org 利用create-react-app ...

  2. 记一下python的method resolution order(MRO)机制

    一直用python都是拿着cookbook和库的文档直接撸,很少会把细节过得那么彻底,遇到问题才会翻文档. 今天看到这个例子的时候我突然触及了我的盲区,我不确定这样的继承层级调用super.foo() ...

  3. 【开发笔记】- 将MySQL数据库表中自增ID从0开始

    命令: 用于清空某表的数据 且让自增的id重新从0开始 truncate table 你的表名

  4. [echart] webpack中安装和使用

    安装echart npm install echarts --save 全量引入 可以直接在项目代码中 require('echarts') 得到 ECharts. 官方示例 var echarts ...

  5. Android 8.0编译过程

    Android编译系统中的Android.bp.Blueprint与Soonghttp://note.qidong.name/2017/08/android-blueprint/ 工具链关系 Andr ...

  6. Dijkstra算法求最短路径 Java实现

    基本原理: 迪杰斯特拉算法是一种贪心算法. 首先建立一个集合,初始化只有一个顶点.每次将当前集合的所有顶点(初始只有一个顶点)看成一个整体,找到集合外与集合距离最近的顶点,将其加入集合并检查是否修改路 ...

  7. 4.LVS的三种工作模式_DR模式

    1.DR模式(直接路由模式:Virtual Server via Direct Routing) DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返 ...

  8. 如何让自己的Dev C++用上C++11标准

    首先确保Dev C++版本是最新的5.11版 其实用C++11标准的语法去运行还是会出现结果的,最多warning一下 但完美主义者是不允许这样的 我们可以点击菜单栏的“工具”->“编译选项”进 ...

  9. Ugly Pairs CodeForces - 1156B

    题目链接:https://vjudge.net/problem/CodeForces-1156B 题意:给定一串字符,相邻字符的ASCII码不能是相邻的数字,比如ABC,假设ASCII码为,99 10 ...

  10. mysql毫秒数引发的问题

    起因:最近同事在做定时打卡的东西,遇到一个诡异的问题,端只是传了一个开始时间跟打卡周期,剩下的打卡时间都是由服务端自己生成的,显示的截止时间有的变成==23:59:59==. 有时候又变成了 ==00 ...