对于外部URL/Rails 6.11/Ruby 3,没有这样的文件或目录@rb_sysopen

对于外部URL/Rails 6.11/Ruby 3,没有这样的文件或目录@rb_sysopen,ruby,Ruby,这在Rails6中运行良好,但是现在将Rails和Ruby升级到6.11和3,它触发了这个“经典”错误。简而言之,使用Rails控制台,此外部URL直接指向Firefox徽标: require 'open-uri' open("https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg") 回溯(最近一次呼叫最后一次): 4:from(irb):1:in`' 3:from(irb):2:i

这在Rails6中运行良好,但是现在将Rails和Ruby升级到6.11和3,它触发了这个“经典”错误。简而言之,使用Rails控制台,此外部URL直接指向Firefox徽标:

require 'open-uri'
open("https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg")
回溯(最近一次呼叫最后一次):
4:from(irb):1:in`'
3:from(irb):2:in'rescue in'
2:from(irb):2:in'open'
1:from(irb):2:in'initialize'
Errno::Enoint(没有这样的文件或目录@rb_sysopen-https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg)

在应用程序中,出现了相同的错误。在Rails和Ruby升级(使用Ruby 2.5.8和Rails 6.0.3.1)之前,这一切都运行得很好。

openURI
过去(在Ruby 3.0之前)使用自己的版本覆盖
内核#open
,该版本还支持从外部URL读取,而不是简单地打开本地文件或运行命令

混合使用这两种用例是非常危险的,如果无法确保传递的URL在任何地方都是安全的(包括使用
内核#open
的第三方代码),则可能会出现严重的漏洞

因此,这种覆盖
内核#open
的行为在Ruby 2.7中被弃用,最终在Ruby 3.0中被删除。要打开外部URL,可以使用以下代码:

URI.open("https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg")

我不确定这些变化是从哪里来的,但是

需要“打开uri”
乌里https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg'
URI.open(URI)#!而不是在没有URI的情况下打开
应该有用

更新
openuri
在3.0版发布之前,确实声明了
Kernel#open
。显然,这在2.7中被弃用了。从现在起,您需要调用
URI.open
。请参阅此处的提交:.

欢迎使用堆栈溢出,@Dario。我不太明白你的问题(你真的不懂第一句话)。您的Rails是否正在执行
open(“https…”)
,或者您的Rails应用程序是否运行在
brandmia.org.
上,而不提供firefox_logo.jpg?这一点非常准确。我今天下午解决了,就是这样。谢谢你的回答!确切地我今天下午解决了,就是这样。谢谢你的回答!
URI.open("https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg")