我有一个已经在生产中运行了几个月的应用程序,其中包含成千上万个附件。今天早上,我尝试对其中一个附件进行操作,并收到以下错误:
Azure::Core::Http::HTTPError: BlobNotFound (404): The specified blob does not exist.
我可以轻松地重新创建此Blob,但是这种情况使我想编写一个脚本来检查附件all的完整性,并确认没有其他丢失。 (我希望这是一个暂时性的网络错误,希望发现的很少,但是我需要放心。)
[我可以看到有一个调用方法似乎完全符合我的需要:exist?(key)
,在此处记录:
https://github.com/rails/rails/blob/master/activestorage/lib/active_storage/service/disk_service.rb
但是,我不知道该如何称呼它。根据this,它被实现为实例方法。那么,如何使用我的Rails应用程序的活动ActiveStorage instance(取决于环境)来使用此方法?
我想知道是否有可能回溯以获取ActiveStorage :: Service :: AzureStorageService的实例(在生产中,并在找到类的每个实例时发现this answer。
[从那里,我发现我可以:
asass = ObjectSpace.each_object(ActiveStorage::Service::AzureStorageService).first
然后让我来:
2.5.5 :015 > asass.exist?(c.json.blob.key)
AzureStorage Storage (313.3ms) Checked if file exists at key: ....PTLWNbEFLgeB8Y5x.... (yes)
=> true
[深入研究Rails的GitHub问题,使我发现可以通过存储对象的实例来访问ActiveStorage服务实例,而我总是可以使用send()
方法来调用其方法之一:
2.5.5 :045 > c.json.blob.service.send(:exist?, c.json.blob.key)
AzureStorage Storage (372.4ms) Checked if file exists at key: ....PTLWNbEFLgeB8Y5x.... (yes)
=> true
我确定这两种方法都可以照亮相同的代码路径,但是目前尚不确定我更喜欢哪种方法。我仍然认为必须存在某种通过app.
或Rails.application.
遍历Rails实例以到达ActiveStorage实例的方法,但是我无法对此进行说明。