I want to write something to a file.
# where userid is any intger [sic]
path = Rails.root + "public/system/users/#{user.id}/style/img.jpg"
File.open(path, 'wb') do |file|
file.puts f.read
end
When this code is executed, I'm getting this error. I know this folder doesn't exist, but File.open with w mode creates a new file if it doesn't exist.
Why is this not working?
Trying to use gets inside a rake task? You may be seeing this error message:
Errno::ENOENT: No such file or directory @ rb_sysopen
Did you try searching the error, and end up on this page? This answer is not for the OP, but for you.
Use STDIN.gets. Problem solved. That's because just using gets resolves back to $stdin.gets and rake is overriding the global variable so that gets tries to open a file handle that doesn't exist. Here's why:
What's the difference between gets.chomp() vs. STDIN.gets.chomp()?
File.open(..., 'w') creates a file if it does not exist. Nobody promised it will create a directory tree for it.
Another thing, one should use File#join to build directory path, rather than dumb string concatenation.
path = File.join Rails.root, 'public', 'system', 'users', user.id.to_s, 'style'
FileUtils.mkdir_p(path) unless File.exist?(path)
File.open(File.join(path, 'img.jpg'), 'wb') do |file|
file.puts f.read
end
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