データベースを使ったアプリ作成 3 (Ruby on Rails の利用)
gem ライブラリを用いた機能拡張
今回は carrierwave を用いてファイルのアップロード機能を実装する.
準備
既存の books テーブルに string 型の picture カラムを増やす.
$ cd ~/my_web_app/book_app $ rails g migration AddPictureToBooks picture:string $ rails db:migrate
画像 upload 機能を持つライブラリ carrierwave gem を追加する. gem を追加する場合は Gemfile へ追記する. bundle install コマンドを実行すると,Gemfile に書かれた gem がインストールされる. 但し,本演習では gem は Debian パッケージを使っているので, /usr/bin/bundle2.7 を指定している.
$ vi Gemfile gem "carrierwave" <-- この 1 行をファイル末尾に追加 $ sudo /usr/bin/bundle2.7 install
carrierwave を利用可能にするために,carrierwave が提供する rails g uploader Picture コマンドを実行して必要なファイルを作成する.
$ rails g uploader Picture create app/uploaders/picture_uploader.rb
モデルの変更
モデルから carrierwave を利用して画像を扱えるように編集する.
$ vi app/models/book.rb 以下のように class 内に行を追加 class Book < ApplicationRecord mount_uploader :picture, PictureUploader end
コントローラの変更
コントローラの Strong Parameter の部分に picture も追加する.
$ vi app/controllers/books_controller.rb def book_params # params.require(:book).permit(:title, :author, :memo, :company) params.require(:book).permit(:title, :author, :memo, :company, :picture) end
ビューの修正
フォームのパーシャルファイルを変更し,pictureの欄を追加する.
$ vi app/views/books/_form.html.erb 以下を適当な場所に追加 <div> <%= form.label :picture, style: "display: block" %> <%= form.file_field :picture %> </div>
詳細表示画面を修正する.
$ vi app/views/books/_book.html.erb 以下を適当な場所に追加 <p> <strong>Picture:</strong> <%= image_tag(book.picture_url) if book.picture.present? %> </p>
動作確認
$ rails s -b 0.0.0.0