You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 6使用Octokit拉取GitHub文件时如何处理404报错

问题原因

你的代码存在两个核心问题导致逻辑无法生效:

  1. Octokit 默认请求失败时(包括404找不到资源)会直接抛出对应类型的异常,不会返回带success?方法的响应对象,因此文件不存在时直接报错,不会进入你的降级分支
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:18:03