PIYO - Tech & Life -

CarrierWave使用モデルのシードデータを用意する

CarrierWave gem Rails

画像アップロード機能を提供するCarrierWaveというgemを使ったRailsアプリケーションのテストについて以前書いた。

RSpecでファイルアップロードのテスト - ぴよログ

今日は同じく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が生成され、指定したアップロード先に画像が配置されていることも確認できる。