はじめに
Rails 6 に追加されそうな新機能を試す第20段。 今回のちょい足し機能は、 ActiveStorage::FileNotFoundError
編です。
Rails 6.0 では、 ActiveStorage::Blob#open
などで対応するファイルが見つからなかったときに ActiveStorage::FileNotFoundError
が発生するようになりました。
記載時点では、Rails は 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は gem install rails --prerelease
でインストールできます。
$ rails --version
Rails 6.0.0.rc1
わざと動作しないコードを書く
今回は、 ActiveStorage::FileNotFoundError
が発生するようにわざと動作しないコードを作成します。
Rails6 のちょい足しな新機能を試す16(UploadedFile#to_path編) で使ったコードを修正して動作しないようにします。
User
モデルの avatar_file_format
メソッドを動作しないように修正します。
class User < ApplicationRecord
...
private
def avatar_file_format
avatar.blob.open do |file|
header = File.read file, 8
if header != PNG_FORMAT_HEADER
errors.add(:avatar, 'is not png format file')
end
end
end
end
試してみる
Rails サーバーを立ち上げて http://localhost:3000/users/new にアクセスしてユーザー登録してみます。
アップロードする画像ファイルも指定します。
Create User
ボタンを押すと ActiveStorage::FileNotFoundError
が発生します。
ファイルのアップロード先に限らず、ファイルが見つからないときは、ActiveStorage::FileNotFoundError
が発生するようになっています。 ファイルが見つからない場合のエラーを rescue
したいときには、何も考えずに ActiveStorage::FileNotFoundError
を指定しておけば良いので、便利ですね。
ソースコード
試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try020_active_storage_missing_file