Railsで外部ファイルを投稿する方法

RailsでファイルをDBに保存するには、

gemをインストールする必要があります。

 

gem 'carrierwave'
gem 'mini_magick'

 

  • carrierwave  → ファイルのアップロード用gem
  • mini_magick → ファイルのリサイズ用gem

次に、画像のアップローダーを作成します。

ターミナルに  rails g uploader image  コマンドを入力すると

app/uploadersディレクトリ内に

「image_uploader.rb」というファイルが作成されます。

このファイルは、元々たくさんの記述があり、多くの項目がコメントアウトされています。

その中の上の方(私は4行目でした)

include CarrierWave::MiniMagick

コメントアウトを外して有効にします。

 

また、リサイズの設定をします。

私は解像度の高いもの、低い物2つ用意したかったので

2つの設定を用意しました。

version :thumb do
process resize_to_fit: [800, 800]
end
version :thumb50 do
process resize_to_fit: [50, 50]
end

thumb、thumb50 という風に名前で区別をしています。

resize_to_fit: [800, 800]は、縦横幅を維持したまま、縦横を800px以内にリサイズするという意味です。

 

 

次に、ファイルをアップロードするテーブルのモデルに下記の記入をします。

mount_uploader :image, ImageUploader

私は、tasksテーブルとusersテーブルにimageカラムを作成し、画像を登録したかったので、

app/models/task.rb と app/models/user.rb

の両方に記入しました。

これで準備は完了です!!

 

仕上げは、ビューへの表示です。

表示する箇所に、

= image_tag current_user.image.thumb50.url, class: "user-picture"

という風に記入します。

thumb50.url の部分で、解像度を指定しています。

ここではクラス名を指定し、CSSでアイコン画像のように装飾しています。

.user-picture {
width: 40px;
height: 40px;
border-radius: 100%;
margin: 10px 20px 10px 10px;
}

f:id:atsukofu:20200510001722p:plain

こんな感じのアイコンが作成可能です!

SNSっぽさが出ますね!

 

imageカラムが空だった場合のデフォルト画像を設定しておく場合は、

app/assets/imagesディレクトリ内にデフォルト画像を保存します。

私はわかりやすく「default.png」という名前で保存しました。

 

次に、app/uploaders/image_uploaders.rb の真ん中やや上ぐらい(私は17行目でした)

に記述のある、

def default_url(*args)

と、それに対応するendのコメントアウトを外します。

そして、メソッド内にデフォルト画像のファイル名を記入します。

"default.png"

 

これでデフォルト画像の設定は完了。

f:id:atsukofu:20200510001845p:plain

チームメンバーの写真を並べてみました。

写真を登録していない二人はデフォルト画像が反映されています。

 

この技術はSNSっぽいものを作るときにまた使えそうです!

さくっとできるようになりたいものですね〜