大名エンジニアカレッジ Ruby on Rails基礎コース 5
「Railsの教科書」を読書会形式で、担当者を決めて読み進めていきます。
2020.11.30は、第7章「画像アップロード機能の追加」と第8章「あとがき」 こちらは前半の「画像アップロード機能の追加」です。
第7章「画像アップロード機能の追加」
この章で学ぶこと。
アプリに画像アップロード機能を追加。
具体的には
- 画像情報を格納するためのDBカラム追加
- carrierwave gemを利用して画像アップロード機能を実装。 引続き、books_appが題材。
1) 画像情報を格納するためのDBカラム追加
既存のbooksテーブルにstring型(文字列)のpicutureカラムを追加
1] 新しいmigrationファイルを作る(設計図作成)
コマンドの基本形
$ rails g migration Addカラム名Toテーブル名 カラム名:型名
だから
$ rails g migration AddpicutureTobooks picuture:strings
2] $ rails db:migrate
で、実際に反映
2) 画像アップロード機能を持つライブラリィ「carrierwave gem」追加
1] Gemfileに追加
どこでもいいのだが、今回は最尾へ。
2] ターミナルで$ bundle install
、実際に反映。
3] carrierwaveを利用可能にするための必要なファイルを作成する。
具体的な手順としては、
$ bin/spring stop
- carrierwaveが提供する
$ rails g uploader Picture
を実行する。
app/uploaders/picture_uploader.rbができている。
他にもファイルはできたのか? ターミナルに全部表示されている。
$ bin/spring stop
は環境によって実行不要な場合もあるのだが、確実に成功するため。springというキャッシュの仕組みを再起動している。
そしてcarrierwaveを利用して画像を扱えるようにするために、モデル・コントローラー・ビューをそれぞれ変更。
3)モデルの変更
app/models/book.rb
mount_uploader :picuture, PictureUploader
を加える。
class Book < ApplicationRecord mount_uploader :picuture, PictureUploader end
4) コントローラーの変更
app/controllers/books_controller.rb
Strong Parameterの部分にpictureを追加
def book_params params.require(:book).permit(:title, :memo, :author, :picture) end
復習「Strong Parameter」とは
受取可能なパラメーターを制限する仕組み(セキュリティ対策
5) ビューの修正
修正する必要があるビューは?
formのパーシャル(使い回すファイル)・index ・show
★new画面が修正対象外なのはなぜ?かと考えてみよう。
1 ] formのパーシャルの変更
app/views/books/_form.html.erb
pictureのための欄を追加。(text_fieldではなく、file_fieldを使っていることに注意)
2 ] 詳細表示画面(show)の変更
app/views/books/show.html.erb
carrierwaveは画像のurlを取得する(または付ける?)ということ?if文
以下のコードより、写真がなくても投稿できるということ?
3 ] 一覧表示画面(index)の変更
一覧表示画面では、画像そのものの表示はしない。ファイル名だけ表示。
app/views/books/index.html.erb
<td><%= book.picture %></td>
を加える。
book.pictureは画像のurlなんだ、、、
6) 動作確認
rails s
実際に画像を投稿してみよう。
★PictureUploaderが見つからない旨のエラー("Unable to autoload constant PictureUploader"など)が発生した場合は、rails serverを一度止め、 bin/spring stop コマンドを実行してからrails serverをもう一度起動して、再アクセス。
7) まとめ
- 本の表示できる要素=写真(カラム)を増やした。
- DBにカラムを追加、
- 画像アップロード機能を持つライブラリィ「carrierwave gem」導入し、使用可能にするための作業
- MCVのファイル、必要なものに変更を反映。
質問
bin/spring stop
は
環境によって実行不要な場合もあるのだが、確実に成功するため。springというキャッシュの仕組みを再起動している。」について。以前rails tutorialでテストが動かないことがあった。
私の感想
carrierwaveは
画像のurlを取得する(または付ける?)ということ?if分
以下のコードより、写真がなくても投稿できるということ?
index.html.erbでは、
book.pictureは画像のurlなんだ、、、。
アプリ
簡単によくできている!素直にすごいと思う。