This was working fine in Rails 6 but now upgrading Rails and Ruby to 6.11 and 3, it's triggering this "classic" error. Basically, to be short, for example this external URL direct to Firefox logo, using the Rails console:
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)
In the app same error. Before the Rails and Ruby upgrade (with Ruby 2.5.8 and Rails 6.0.3.1) this was working perfectly fine.
open-uri
used to (before Ruby 3.0) overwrite Kernel#open
with its own version which also supports reading from external URLs rather than simply opening local files or running commands.
Mixing those two use-cases was quite dangerous and had the potential for serious vulnerabilities if the passed URL was not ensured to be safe everywhere (including third-party code using Kernel#open
).
As such, this behavior to overwrite Kernel#open
was deprecated in Ruby 2.7 and finally removed in Ruby 3.0. To open an external URL, you can use the following code instead:
URI.open("https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg")
I am not exactly sure where the change comes from, but
require 'open-uri'
uri = 'https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg'
URI.open(uri) # ! instead of open without URI
should work.
Update
open-uri
did declare Kernel#open
until the 3.0 release. Apparently that was deprecated in 2.7. From now on, you need to call URI.open
. See the commit here: https://github.com/ruby/open-uri/commit/53862fa35887a34a8060aebf2241874240c2986a .
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With