CarrierWaveでseedデータに画像を投入する方法

甘党エンジニアのkanjiです。

CarrierWaveを使って、初期値としてseedデータに画像を入れる方法について書きたい。

そもそもseedファイルとは何か?

db/migrateの中に入っているseed.rbは、簡単に言うと初期データのことを表す。

データベースに投入したい初期データを、railsコマンドを実行すれば投入することができる。

例えばこんなデータを投入したい場合。

Food.create!(
   name: 'りんご',
   category: '果物',
   calorie: 120,
)

上記のようにdb/seeds.rbを編集しrails db:seedを実行すれば、データベースに値が反映される。

さらに画像を初期データとして追記したい際、CarrierWaveを使うことで簡単に導入できる。

※ちなみにCarrierWaveの設定は、まずはgemをbundle installして

gem 'carrierwave'

その後は画像のアップローダーを作成

rails g uploader image

アップローダー作成後は、該当するモデル(今回の場合Foodモデル)にimage_uploaderをマウントする記述を行う。

mount_uploader :image, ImageUploader
→create app/uploaders/image_uploader.rb

これで準備完了。

あとは導入したい画像をpublic配下のimagesフォルダなどに格納し、先程のseedファイルに下記のように記述。

Food.create!(
   name: 'りんご',
   category: '果物',
   calorie: 120,
   image:File.open("./public/images/ファイル名.jpg"),
)

最後にrails db:seedを実行し完了。

rails db:seed
DBをリセットしたい場合
rails db:resetでデータベースをリセットすることができる。

補足

 

1度で複数のデータを投入する場合、このような配列の書き方にすると便利。

Food.create!(
   [
    {name: 'りんご',calorie: 120, category: '果物',image:File.open("./public/images/fruit1.jpg")},
    {name: 'バナナ',calorie: 100, category: '果物',image:File.open("./public/images/fruit2.jpg")},
    {name: 'オレンジ',calorie: 80, category: '果物',image:File.open("./public/images/fruit3.jpg")}
   ]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です