Rails 6 如何使用 Octokit 从 Github 文件获取中处理 404
Rails 6 how to handle 404 from Github file fetching using Octokit
在我的 Rails 6 应用程序中,我正在尝试实现负责从不同的 Github 存储库中获取文件的功能。该代码应尝试从 GitHub 获取文件 name.json
或 name.master.json
(因为该文件可能是主文件 json 或标准文件 json)。
代码如下:
#lib/github_client.rb
module GithubClient
extend self
def fetch_file(file_name)
if (response = translate(file_name)).success?
response
else
translate(file_name, master: true)
end
end
private
def client
@client ||= Octokit::Client.new(access_token: Rails.application.credentials.github[:access_token])
end
def translate(file_name, master: false)
return client.contents('user/my-repo-name', path: "#{file_name}.master.json") if master == 'true'
client.contents('user/my-repo-name', path: "#{file_name}.json")
end
end
行 if (response = translate(file_name)).success?
不起作用,因为如果没有文件,例如book.master.json
它将 return:
Octokit::NotFound (GET https://api.github.com/repos/user/my-repo-name/book.json: 404 - Not Found // See: https://docs.github.com/rest/reference/repos#get-repository-content)
我如何检查此响应的状态,以便它在必要时搜索另一个文件?
我不确定是否有 #exists?
方法或类似方法,这可能是更好的解决方案(我在文档中看不到这样的方法!...),但您可以总是只是挽救异常以优雅地处理预期的失败。例如:
client.contents('user/my-repo-name', path: "#{file_name}.json")
rescue Octokit::NotFound
client.contents('user/my-repo-name', path: "#{file_name}.master.json")
请注意,由于您正在检查 if master == 'true'
,因此您当前的代码也略有错误 - 但 master
是一个 布尔值 (true
/ false
), 不是 String
("true"
).
true != "true"
在我的 Rails 6 应用程序中,我正在尝试实现负责从不同的 Github 存储库中获取文件的功能。该代码应尝试从 GitHub 获取文件 name.json
或 name.master.json
(因为该文件可能是主文件 json 或标准文件 json)。
代码如下:
#lib/github_client.rb
module GithubClient
extend self
def fetch_file(file_name)
if (response = translate(file_name)).success?
response
else
translate(file_name, master: true)
end
end
private
def client
@client ||= Octokit::Client.new(access_token: Rails.application.credentials.github[:access_token])
end
def translate(file_name, master: false)
return client.contents('user/my-repo-name', path: "#{file_name}.master.json") if master == 'true'
client.contents('user/my-repo-name', path: "#{file_name}.json")
end
end
行 if (response = translate(file_name)).success?
不起作用,因为如果没有文件,例如book.master.json
它将 return:
Octokit::NotFound (GET https://api.github.com/repos/user/my-repo-name/book.json: 404 - Not Found // See: https://docs.github.com/rest/reference/repos#get-repository-content)
我如何检查此响应的状态,以便它在必要时搜索另一个文件?
我不确定是否有 #exists?
方法或类似方法,这可能是更好的解决方案(我在文档中看不到这样的方法!...),但您可以总是只是挽救异常以优雅地处理预期的失败。例如:
client.contents('user/my-repo-name', path: "#{file_name}.json")
rescue Octokit::NotFound
client.contents('user/my-repo-name', path: "#{file_name}.master.json")
请注意,由于您正在检查 if master == 'true'
,因此您当前的代码也略有错误 - 但 master
是一个 布尔值 (true
/ false
), 不是 String
("true"
).
true != "true"