Activestorage フィクスチャ アタッチメント 質問する

Activestorage フィクスチャ アタッチメント 質問する

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) で構成されます。

おすすめ記事