外部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。
THE END
二维码