Logs

来世はねこです

大名エンジニアカレッジ 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を利用可能にするための必要なファイルを作成する。

具体的な手順としては、

  1. $ bin/spring stop
  2. 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」とは

受取可能なパラメーターを制限する仕組み(セキュリティ対策

(4.3 createアクションのところ)

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なんだ、、、。

アプリ

簡単によくできている!素直にすごいと思う。

みんなで話してみたこと