せまい部屋

web/gameエンジニアのweblog

ActiveStorageのreturnにはまっためも

どうにもテストが落ちてしまって地味な検証を要した

tl;dr

ActiveStorageで has_many_attached マクロを設定している場合、model.attach(ファイル)の戻り値はActiveStorage::Attachmentの配列。has_one_attached マクロを設定していると model.attach(ファイル)のreturnはnil

railsguides.jp

起きたこと

Trailblazerなんか使っているので一つずつステップを記述していて、その一つに、ActiveStorageへのファイルアップロードがありました。以下のような感じ。

class User < ActiveRecord::Base
  ...
  has_many_attached :photos
  has_one_attached :icon
  ...
end
class MyOperation < Trailblazer::Operation
  ...
  step :save!
  ...

  def save!(options, user:, **)
    user.icon.attach(options[:params][:file])
  end
end

運良く事前に :photos に対する多数のファイル添付が可能なように実装されていたので、仕様に沿って今回は1対1となるような has_one_attached マクロを設定。比較的似たような処理を書くもののどうにもrequestのスペックが通らず…

結果

今回のケースだとstepに指定している save! メソッドがtruthyであればいいけどずっとnil返しててしんでいました。実地で戻り値を確認していくと、attachメソッド返り値が違うぽくて、多数添付できる場合は [#<ActiveStorage::Attachment id: ...>] 、1対1の場合はnilになってfalthyになってました。事前に実際リクエストして試したのも裏目に出て余計発見できませんでした😞
attach自体は意図した動作であることを確認して、現状は以下の感じで確認するように改修しています。

  def save!(options, user:, **)
    user.icon.attach(options[:params][:file])
    user.attached?
  end

LL久しぶりだけどRailsとその周りのツール群はどうにもメタなことやりすぎてる感じが難しい。