Rails テストでは、activestorage のみを含む基本モデルがあります。
class User < ApplicationRecord
has_one_attached :avatar
end
私はそれを固定具にしようとしていますが、うまくいきません (そこにイメージはあります):
# users.yml
one:
avatar: <%= File.open Rails.root.join('test', 'files', 'image.png').to_s %>
フィクスチャを通じてアバター ファイルを適切に添付するにはどうすればよいですか?
ベストアンサー1
これは、誰もが思っているよりもはるかに簡単です。誰かを非難するつもりはありません。これらの回答に基づいてこれを理解するのに時間がかかりました。簡単にするために、同じデータ モデルを使用します。
ユーザーには「アバター」が 1 つ添付されています。次のようなユーザー フィクスチャがあるとします。
# users.yml
fred:
name: Fred
必要なことはこれだけです:
% mkdir test/fixtures/active_storage
ここで、そのディレクトリに「attachments.yml」と「blobs.yml」を配置します。「attachment」レコードは、ユーザーだけでなく BLOB も参照します (エントリはフィールドname
の名前であることに注意してくださいhas_one_attached
)。
# active_storage/attachments.yml
freds_picture:
name: avatar
record: fred (User)
blob: freds_picture_blob
そして
# active_storage/blobs.yml
freds_picture_blob:
key: aabbWNGW1VrxZ8Eu4zmyw13A
filename: fred.jpg
content_type: image/jpeg
metadata: '{"identified":true,"analyzed":true}'
byte_size: 1000
checksum: fdUivZUf74Y6pjAiemuvlg==
service_name: local
key
コードでは次のように生成されます。
ActiveStorage::Blob.generate_unique_secure_token
これをコンソールで実行すると、上記のフィクスチャのキーを取得できます。
これで、画像を添付するのに「機能」するようになります。実際のファイルをそこに保存する必要がある場合は、まず config/storage.yml を見て、ファイルが保存されているパスを確認します。デフォルトでは、「tmp/storage」です。上記のファイルはここに保存されます。
tmp/storage/aa/bb/aabbWNGW1VrxZ8Eu4zmyw13A
チェックサムを計算するには、ここを参照してください:
Rails ActiveStorageのBLOBテーブルでチェックサムはどのように計算されるのか
md5_checksum = Digest::MD5.file('tmp/storage/aa/bb/aabbWNGW1VrxZ8Eu4zmyw13A').base64digest
フィクスチャで erb を使用してファイル サイズとチェックサムを入力することが可能です。
byte_size: <%= File.size('tmp/storage/aa/bb/aabbWNGW1VrxZ8Eu4zmyw13A') %>
checksum: <%= Digest::MD5.file('tmp/storage/aa/bb/aabbWNGW1VrxZ8Eu4zmyw13A').base64digest %>
最初にファイルをストレージ ディレクトリにコピーする必要があることに注意してください。テスト環境のストレージ ルート ディレクトリはtmp/storage/
デフォルトで であり、残りのパスは の最初の 4 文字key
(つまりtmp/storage/aa/bb
) で構成されます。