Rails 6使用Octokit拉取GitHub文件时如何处理404报错
问题原因
你的代码存在两个核心问题导致逻辑无法生效:
- Octokit 默认请求失败时(包括404找不到资源)会直接抛出对应类型的异常,不会返回带
success?方法的响应对象,因此文件不存在时直接报错,不会进入你的降级分支 translate方法的master参数判断逻辑错误:你传入的是布尔值true,但判断条件写的是master == 'true'(字符串相等判断),永远不会触发master后缀文件的拉取逻辑
修复后代码
# lib/github_client.rb module GithubClient extend self def fetch_file(file_name) # 优先拉取标准json文件,捕获404异常后降级拉取master版本 translate(file_name) rescue Octokit::NotFound translate(file_name, master: true) end private def client @client ||= Octokit::Client.new(access_token: Rails.application.credentials.github[:access_token]) end def translate(file_name, master: false) # 修正参数判断,直接用布尔值判断生成对应路径 file_suffix = master ? 'master.json' : 'json' client.contents('user/my-repo-name', path: "#{file_name}.#{file_suffix}") end end
可选优化
如果需要处理两个文件都不存在的场景,避免直接抛出异常,可以再加一层异常捕获,按照你的业务需求返回默认值:
def fetch_file(file_name) translate(file_name) rescue Octokit::NotFound translate(file_name, master: true) rescue Octokit::NotFound # 两个文件都不存在时返回nil,你也可以根据业务需要返回空值、抛自定义异常等 nil end
内容的提问来源于stack exchange,提问作者mr_muscle
相关产品推荐
相关产品推荐

