Redis 中用 String 型存了用户登录令牌,key 是令牌,value 是该用户的 ID. 定义一个 auth 方法,如果根据令牌能读到合法的用户 ID, 就意味着该令牌有效而且能获取 ID.(敏感权限再去数据库验证身份)
在一部分接口中需要登录才能操作,所以希望一旦令牌非法,auth 方法直接 render 错误码然后终结后续操作.
这个场景在 PHP 中可以用 die("err_info");
来处理。
4-ways-to-early-return-from-a-rails-controller 这篇文章提到了几个实用方法,利用返回值和 return 的组合. 但我想要的是一旦触发某个条件,无论是在 Controller 还是在某个方法里,立即 render 结果并终结后续操作。
利用异常。
module DiyExceptions
class RenderAndDie < StandardError
end
end
class ApplicationController < ActionController::API
# sth...
# 类比PHP die()
rescue_from DiyExceptions::RenderAndDie do |ex|
msg = JSON(ex.message) rescue [1, "RenderAndDie"]
resp = {
code: msg[0],
info: msg[1]
}
render json: resp
logger.debug ">>>\n#{resp.to_json}<<<\n"
end
# 完全成功的请求
# 直接结束请求
def success(info)
info = JSON.parse(info) rescue info if info.instance_of?(String)
raise DiyExceptions::RenderAndDie, [0, info].to_json
end
# 业务上失败的请求, code > 0
# 直接结束请求
def failed(code, info)
info = JSON.parse(info) rescue info if info.instance_of?(String)
raise DiyExceptions::RenderAndDie, [code, info].to_json
end
# sth...
end
如此,使用 failed 或 success 方法就可以啦 ;)
success "操作成功"
success [1,2,3]
success render_to_string json: {list: posts_list, total: posts_total}, include: {:user => {only: [:id, :name, :avatar]}}