画像アップロード機能を提供するCarrierWaveというgemを使ったRailsアプリケーションのテストについて以前書いた。
今日は同じくCarrierWaveに関連して、アップロードする画像を持つようなモデルのシードデータをどのように作成するかという話をする。
seed.rb
Railsで初期データ作るならdb/seeds.rb
に色々書くと思う。ここに書いたコードはRakeタスクから呼び出せる。RailsをロードしたあとなのでRailsのモデルを直に操作する感じでデータを登録していくことができる。
# db/seeds.rb
Product.create(name: "product name", price: 200)
Product.create(name: "product2 name", price: 1000)
...
画像はどうする
ここまでは普通にモデルのアトリビュートをハッシュで与えればいいので特に考えなければいけないことはない。
ところで、↑のProductモデルが画像を持っているとしたらどうだろう?
Product.create(name: "product name", price: 200, image: "product_image.jpg")
これでは実際の画像ファイルはアップロードされず、シードデータとしては意味をなさない(余談だけどテストの場合はこれでも通ってしまう。DBとしては文字列として持っているだけなので)。
結論からいうと、画像ファイルのパスをopenしてそれを渡せばOK。
例えばdb/fixtures
というディレクトリを掘ってそこに画像を置いておき、seeds.rb
では
Product.create(
name: "product name",
price: 200,
image: open "#{Rails.root}/db/fixtures/image01.jpg"
)
という感じにする。これでrake db:seed
実行するとProductが生成され、指定したアップロード先に画像が配置されていることも確認できる。