1. ホーム
  2. ruby

[解決済み] ルビーです。そのようなファイルやディレクトリはありません @ rb_sysopen - testfile (Errno::ENOENT)

2022-02-13 07:53:07

質問

あるファイルに何かを書き込みたい。

# 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 

このコードを実行すると、こんなエラーが出ます。このフォルダが存在しないことは分かっているのですが File.openw モードは、ファイルが存在しない場合、新しいファイルを作成します。

なぜこれがうまくいかないのでしょうか?

どうすればいいですか?

File.open(..., 'w') は、ファイルが存在しない場合、ファイルを作成します。誰もそのファイルのためにディレクトリツリーを作成することを約束しませんでした。

もうひとつは File#join を使うことで、文字列の連結ではなく、ディレクトリのパスを構築することができます。

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