Rails如何使用同一if条件包裹Api控制器多段业务逻辑
实现方案
你写的伪代码逻辑本身是成立的,Ruby的类定义支持直接写条件判断块,你可以把所有需要同一条件控制的逻辑统一放到同一个判断块内,避免重复写判断条件,示例代码如下:
class Api::BaseController < ApplicationController # 所有需要条件触发的逻辑统一放在同一个判断块内 if SAME_CONDITION # 替换为你实际的判断逻辑,比如全局配置开关、环境判断等 include Api::AuthConcern before_action -> { some_function() } rescue_from Api::AuthConcern::Unauthenticated do |e| render status: 401, json: { error: e.error } end rescue_from Api::AuthConcern::PermissionDenied do |e| render status: 403, json: { error: e.error } end end # 其他不需要条件控制的基础逻辑写在块外 end
两种场景的适配说明
- 如果你的条件是应用启动时就确定的静态判断(比如是否是生产环境、是否开启某全局功能开关),直接用上面的写法即可,该段逻辑只会在控制器类加载时执行一次,运行时不会重复判断。
- 如果你的条件需要每次请求动态判断(比如根据请求域名、请求参数判断是否启用认证),使用下面的写法:
class Api::BaseController < ApplicationController # 全局引入认证模块 include Api::AuthConcern # 满足条件时跳过认证、执行自定义前置动作 before_action :authenticate_user!, unless: -> { SAME_CONDITION } before_action -> { some_function() }, if: -> { SAME_CONDITION } # 异常捕获逻辑直接全局定义即可,只有触发认证时才会抛出对应异常,无额外性能影响 rescue_from Api::AuthConcern::Unauthenticated do |e| render status: 401, json: { error: e.error } end rescue_from Api::AuthConcern::PermissionDenied do |e| render status: 403, json: { error: e.error } end end
内容的提问来源于stack exchange,提问作者Liondancer
相关产品推荐
相关产品推荐

