外部URL/Rails6.11/Ruby3没有这样的文件或目录@rb_sysopen

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

require 'open-uri'
open("https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg")
Traceback (most recent call last):
        4: from (irb):1:in `<main>'
        3: from (irb):2:in `rescue in <main>'
        2: from (irb):2:in `open'
        1: from (irb):2:in `initialize'
Errno::ENOENT (No such file or directory @ rb_sysopen - https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg)

在应用程序中相同的错误。在 Rails 和 Ruby 升级(使用 Ruby 2.5.8 和 Rails 6.0.3.1)之前,这工作得很好。

回答

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

如果不能确保传递的 URL 在任何地方都是安全的(包括使用 的第三方代码Kernel#open),那么混合这两个用例是非常危险的,并且有可能产生严重的漏洞。

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

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


回答

我不确定变化来自哪里,但是

require 'open-uri'

uri = 'https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg'
URI.open(uri) # ! instead of open without URI

应该管用。

更新
open-uri确实声明,Kernel#open直到 3.0 版本。显然,这在 2.7 中已被弃用。从现在开始,您需要调用URI.open. 请参阅此处的提交:https : //github.com/ruby/open-uri/commit/53862fa35887a34a8060aebf2241874240c2986a。


以上是外部URL/Rails6.11/Ruby3没有这样的文件或目录@rb_sysopen的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>