这在Rails 6中工作正常,但现在将Rails和Ruby升级到6.11和3,它会触发这个“经典”错误。简单地说,例如使用Rails控制台直接指向Firefox徽标的外部URL:
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和Rails6.0.3.1),这是完全正常的。
2条答案
按热度按时间gzjq41n41#
在Ruby 3.0之前,
open-uri
使用自己的版本覆盖Kernel#open
,该版本还支持从外部URL阅读,而不是简单地打开本地文件或运行命令。然而,混合这两种用例是非常危险的,并且如果不能确保传递的URL在任何地方都是安全的(包括使用
Kernel#open
的第三方代码),则可能存在严重的漏洞。因此,这种覆盖
Kernel#open
的行为在Ruby 2.7中被弃用,最终在Ruby 3.0中被删除。要打开外部URL,可以使用以下代码:p1tboqfb2#
我不知道这个变化是从哪里来的,但是。
应该可以
更新
open-uri
在3.0版本之前确实声明了Kernel#open
。显然在2.7版本中已经弃用了。从现在开始,你需要调用URI.open
。请在这里查看提交:https://github.com/ruby/open-uri/commit/53862fa35887a34a8060aebf2241874240c2986a。