Ruby on Rails
入門3
- さて前回までで、MVCフレームワークのMVCのうちの【V】と【C】である、
- view(ビュー)
- controller(コントローラー)
- をカンタンにですが学びました。
-
viewとは、サイトに表示させる部分のこと、つまりは【 .erb 】ファイルのことでした。
- viewsフォルダに入っていますね。
-
controllerとは、司令塔部分のことで、【 ◯◯_controller.rb 】ファイルのことでした。
- controllersフォルダに入っていましたね。
- 今回は、残りの重要な要素であるmodel(モデル)を学んでいきましょう。
- モデルは主に「データベース(DB)」に関係します。
- ある程度、本格的なサイトを作ろうとすると、データベースは必須です。
- なのでまずはデータベースに関して簡単に学びます。次へ。
前回のおさらい
- さて、そもそも【データベース】とはなぜ必要なのでしょうか?その点から理解しておきましょう。
- よく使われる例えで言います。
- ある友達(友達1)に電話番号を教えてもらいました。トムはそれを【チラシ1のうら】にメモっておきました。
- [てつお:090-1000-1000]みたいな感じです。
- さらに別の友達(友達2)にも電話番号を教えてもらいました。トムはそれを【チラシ2のうら】にメモっておきました。
- さらに別の友だち(友達3)にも、さらに別の友達(友達4)にも…というように電話番号が増えていき、気づくとチラシだらけになってしまいました。
- このままでは、てつおに電話かけたい時に、どのチラシに書いたのか見つけるのが大変です。
- さらに間違ってチラシを捨ててしまう可能性もあります。
- これはヤバイと思ったトムは【ノート】を買ってきて、電話番号と名前をすべてそのノートにまとめました。
- ある友達(友達1)に電話番号を教えてもらいました。トムはそれを【チラシ1のうら】にメモっておきました。
- この電話番号をまとめたノート(電話帳)のことが【データベース】です。
- 実はデータベースとは、これだけの事なのです。めちゃカンタンですよね。
データベースとは
- 電話帳を例に、もう少しデータベースの理解を深めましょう。
- 多くの友達の電話番号を保存していくためには、電話帳にはどんな感じで書けば良いでしょうか?
データベースとは

- 普通に書くと左の感じです。
- ただ【名前】と【電話番号】というのが何度も書かれていて、ムダが多い気がしますね。
- これをもっとまとめましょう。
- 次のページに続きます。
- 以下は改良版です。このように【枠(わく)】を作ってしまえば、イチイチ【名前】と【電話番号】は書かなくてもOKですよね。
- この枠のことを【スキーマ】と呼びます。
データベースとは
- ただし、スキーマはただ「こういう枠を書く」という設定だけですので、実際にデータは入れられません。
- 実際にスキーマ通りのデータを入れられるものを【 テーブル 】と言います。
- わかりにくいですが、スキーマは設計図、テーブルは実際にデータが入っている所、と考えてください。
- 以上の事から、左の画像は【電話番号テーブル】というわけです。
- 「データベースにデータを入れる」という事は、この「テーブルにデータを入れる」ということです。

- また、テーブルの枠の、それぞれの列の項目を【カラム】と言います。※赤枠
- HTMLの時も出てきましたが、カラムとは単純に列のことです。
データベースとは
- この例では[名前]と[電話番号]のカラムだけですが、[日付]などもっと色んなカラムを用意しても良いですね。
- データベースに関しての説明は以上です。
- この左のようなデータベースを、Railsで作っていきます。

- では【Model】(モデル)を作っていきましょう。
-
【Model】は、「データを管理する役目」なんて書きましたが、実はあまり正しい表現ではありません。
- もう少し正確にいうと、【 テーブルをRubyのプログラミングで操作するためもの 】と言う方が良いでしょう。
- (これはまだ意味不明だと思うので、ふーんでOKです)
- 実際にやってみましょう。
- 以下のコマンドを Shell に入力して実行してください。
Modelの作成
- 以下のようになればOKです。
- コマンドの説明です。
Modelの作成
- ①Railsのコマンドという意味。
- ② g = generate(ジェネレート:生成する)という意味。
- ③ model(モデル)を作るという意味。
- ④ book(ブック)という名のモデルという意味。
-
⑤ name(ネーム)という名のカラムを用意するという意味。
- カラムには型が設定できるのですが、今回は何も指定していません。
- 何も指定しない場合は、自動的に string(ストリング:文字列)になります。
- 注目点は、名前の付け方(book)です。
- controller(コントローラー)の時は、【books】(複数形)という名前でした。
- それがmodel(モデル)だと【book】(単数形)になっています。
- 実はこれはRailsの決まりで、必ず守る必要があります。
- controllerは、複数形で、modelは単数形です。覚えておきましょう。
①
②
③
④
⑤
- これでbookモデルが出来ました。
- app/models/book.rb というファイルが増えていますので、確認しておきましょう。
ファイルの確認
- このファイルにはBookクラスというものが作られています。
- 言い方を変えれば、Bookモデルとは、Bookクラスのことなのですが、特に気にしなくて良いです。
- ちなみに、このファイルはあまりイジることはありません。今回も特に何もしなくても良いです。
- 次のページへ。
- もう一つファイルが増えていまして、そっちが重要です。
- 今回は appフォルダではなく、dbフォルダというものを探してください。
- そのdbフォルダの中に、migrate というフォルダがあり、その中に「日付のような数字_create_books.rb」というファイルがありますので、それをクリックしてください。(日付のような数字、の部分は作った日などによって異なります)
ファイルの確認
- このファイルが非常に重要になってきますので、中身を簡単に説明しておきます。
ファイルの確認
- 注目するのは、①-③までの部分でOKです。
- まず①は「booksというテーブルを作る」ということが書いてあります。
- モデル(クラス)の時は book と単数形でしたが、テーブルは books と複数形になっていますね。
- 次に②は「nameというカラムを、string(文字列)型で作る」という事が書いてあります。
- カラムとは行のことでしたね。実際にデータが入る変数や、配列のイメージをしてもらったら良いですが、データベースの場合は型の種類を指定しないといけません。
- 最後の③は「timestampsというカラムを作る」という事が書いてあります。これは日付みたいなもので、自動的に作られます。次へ。
①
②
③
- つまり、今の時点で右のようなテーブルが作られることになります。
- ※timestampsは、created_at(作成日時)とupdated_at(更新日時)の二つのカラムが作成されます。
- このテーブルに、実際のデータが追加されていくことになります。
ファイルの確認
name | created_at | updated_at |
---|---|---|
name | created_at | updated_at |
---|---|---|
ザリガニの冒険 | 2018/02/19 19:48 | 2018/02/19 19:48 |
ザリガニVS伊勢エビ | 2018/02/19 20:48 | 2018/02/19 20:48 |
ザリガニになる方法 | 2018/02/19 21:48 | 2018/02/19 21:48 |
- さて、現状確認のために一度サイトにアクセスしてみましょう。(どのページでも良いです)
- すると、以下のようなエラー画面になると思います。
現状確認
- 「ActiveRecord::PendingMigrationError」(アクティブ レコード::ペンディング マイグレーション エラー)というエラーが出ていますね。
- まず「アクティブレコード」とは、データベースを簡単に使えるようにする仕組みのことで、今は気にしなくてOKです。
- 次の「ペンディング マイグレーション エラー」というのは「保留中のマイグレーションがあるためエラー」という意味になります。
- 「保留中のマイグレーション」と何なのでしょうか?次のページへ。
- マイグレーションとは「移行」という意味で、これが出来ていないためのエラーが出ている状態です。
- 実は「Railsとデータベースは別のもの」なんです。別のものなので「マイグレーション(移行する)」という作業が必要になります。
- ちょっとここらへんは、ややこしく感じますが別に難しくありません。下のようなイメージです。
マイグレーションとは?

サイトを使う人




モデル
ビュー
コントローラー
Railsチーム
データベース君
マイグレーション(移行)
が必要
- 先ほど作った「日付のような数字_create_books.rb」のファイルは「マイグレーションファイル」と言って、必ずデータベースにマイグレーションしないといけないファイルになります。
- 今のように「ファイルを作ったのに、マイグレーションをしていない」状態が PendingMigration(保留のマイグレーションがある)状態になるため、エラーになっている、ということです。
- 今回はわざとエラーを出していますが、このエラーはよくやりがちなので、覚えておいてください。
- では、マイグレーションをやっていきましょう。以下のコマンドを Shell に入力し、実行してください。
マイグレーションとは?
- 成功すれば以下のようになり、マイグレーションが完了となります。ページも表示されるようになります。
- マイグレーションが完了したので、これでデータベースにbookテーブルが作成されました。
- さらに、スキーマ(テーブルの設計図)が「db/schema.rb」に作成されますので、確認しておきましょう。
マイグレーションとは?
1~12行目までは、ただのコメントなので省略してます
(# で始まる行はコメントといって、プログラムではない部分です)
- マイグレーションが完了したので、これでデータベースにbookテーブルが作成されました。
- さらに、スキーマ(テーブルの設計図)が「db/schema.rb」に作成されますので、確認しておきましょう。
- スキーマファイルの中身を見てもらえれば、なんとなくわかると思いますが、booksというテーブルが作られて、
- そこに「name, created_at, updated_at」の3つのカラムが作られている、ということが書いていますよね?
- 細かいポイントとして「precision: 6」は「精度(どこまで細かい時間を保存するか)の設定」は、「null: false」は「null(空のデータ)を許さない(エラーになる)」などの設定ですが、別に今は気にしなくても良いです。
- マイグレーションが完了したので、これでデータベースにbookテーブルが作成されました。
- さらに、スキーマ(テーブルの設計図)が「db/schema.rb」に作成されますので、確認しておきましょう。
- さて、先ほど作られたbooksテーブルは中身が空っぽですので、これに初期データを入れて置きたいと思います。
- 初期データは dbフォルダ内の seeds.rd(シードズ)ファイルいうところに入力します。(seedとは種(たね)という意味です)
- まずはファイルを開いてみてください。
- 最初はコメントだけで、何も書いていません。
- ここに初期データを記入します、次へ。
seedファイル
- 以下のようにコードを追加してみましょう。※【@book.name = ”◯◯"】の部分は、もちろん自分で決めた本の名前に変えてください。
seedファイル
- 軽くコードの説明もしておきます。
- 【@book = Book.new】の部分で、Bookクラスの新しいインスタンスを作っています。
- ※インスタンスとは、そのクラスから作られたオブジェクトのことですね。
- 【@book.name = "本の名前"】で、上で作ったインスタンスの、nameカラム(フィールド)に文字列(本の名前)を代入してます。
- 【@book.save】で、データベースに保存しています。※データベースの場合、保存しないと消えます。
- 初期データの入力が終わったら、この初期データをデータベースに反映させるコマンドを実行します。
seedファイル
- 問題なければ、特に何も表示されずに終了します。
- 次に、実際にデータが入っているか?を確認する方法をやりましょう。
- 以下のコマンドを実行してください。
- 「rails c 」の「 c 」とは、console(コンソール)のことで、Railsと直接対話できるモードになります。
- 以下の画面になると思うので、ここにRailsに対するコマンドを実行します。次のページへ。
- では、さらに「Book.all」というコマンドを実行してください。成功すれば、ズラズラっと現在のbookのデータがすべて表示されます。
railse c
- これでちゃんとデータが入っていることが確認できました。
- この確認方法は今後も使いますので覚えておきましょう。
- rails cを終了するには「 quit 」というコマンドを実行してください
- データベースにデータがちゃんと入っていたことは確認出来たので、今度はこのデータベースのデータを表示できるようにしましょう。
- そのために、まずはcontroller(コントローラー)ファイルを編集しますので、「 app/controllers/book_controller.rb 」を開きましょう。
- 今は下の①の画像みたいな感じになっていると思うので、②の画像のように変更してください。
コントローラーの変更
- まずは index の方だけです。show はまた後でします。
- この「Book.all」は、先ほどrails c の時にも使ったコマンドですね。
- 先ほど画面に表示されたデータすべてが、@books 変数に入る、ということです。次へ。
- 次はビューも変更します。「 app/views/books/index.html.erb 」を開いて、以下のように変更してください。
- ポイントは「
@books.each do |book|
」の部分ですが、これは「繰り返し文」でしたね。 - @booksの中の要素を一つ一つ取り出し、それを book の中に代入してくれます。
- 取り出す要素がなくなると繰り返しは終了です。次のページへ。
ビューの変更
- @books.each の動きは以下のようになります。
each文の動き
name | created_at | updated_at |
---|---|---|
ザリガニの冒険 | 2018/02/19 19:48 | 2018/02/19 19:48 |
ザリガニVS伊勢エビ | 2018/02/19 20:48 | 2018/02/19 20:48 |
ザリガニになる方法 | 2018/02/19 21:48 | 2018/02/19 21:48 |
1回目の繰り返しの時は、これを取り出し、bookに入れる→
- また「 book.name 」とは「bookのnameカラム」のことですので、1回目は「ザリガニの冒険」になります。
- 2回目は、以下のように別のデータを取り出してくれます。
name | created_at | updated_at |
---|---|---|
ザリガニの冒険 | 2018/02/19 19:48 | 2018/02/19 19:48 |
ザリガニVS伊勢エビ | 2018/02/19 20:48 | 2018/02/19 20:48 |
ザリガニになる方法 | 2018/02/19 21:48 | 2018/02/19 21:48 |
2回目の繰り返しの時は、これを取り出し、bookに入れる→
- bookの中身が入れ替わっているため、2回目の時の、book.name は「ザリガニVS伊勢エビ」になります。
- このようにデータが無くなるまで、繰り返し処理してくれます。
- ちなみに、book のようなデータの1単位を「レコード」と言います。
- つまり Book.all を代入した「@books」は「bookテーブルのすべてのデータ」
- そこから1つの行を取り出して、代入した「book」は「1レコード」
- その1レコードに、様々なカラムがあり、そこになにかしらの値が入っている、という感じです。
name | created_at | updated_at |
---|---|---|
ザリガニの冒険 | 2018/02/19 19:48 | 2018/02/19 19:48 |
ザリガニVS伊勢エビ | 2018/02/19 20:48 | 2018/02/19 20:48 |
ザリガニになる方法 | 2018/02/19 21:48 | 2018/02/19 21:48 |
横軸(行)がレコード→
縦軸(列)がカラム↓
- これが Rails からデータベースを使う流れになります。
- 最初はちょっとわかりにくいと思いますが、やってるうちに慣れてくると思います。
データベースの値を取り出す時は「レコード.カラム」という指定方法になる
(book.nameなど)
データベースの使い方
- では、ページを確認しておきましょう。(確認するのは index ページですね。URLの末尾は/books/indexです)
- 成功していれば、前と同じ表示になっているはずです。
- ※以前はコントローラーで用意した変数を表示していましたが、今回はデータベースのデータを表示しています。
現状の確認
- では、次は show もデータベースから表示できるようにしましょう。
- ただ、こっちはちょっとややこしいので、段階的に変化させていきます。次へ。
- では、まずはコントローラーです。以下のように変更してください。※もちろん("ザリガニの冒険")の部分は、自分の本タイトルにしてください。
コントローラーの変更
- 新しく【.find_by】(ファインド_バイ)というメソッドを使っていますね。
- これは nameカラム に "ザリガニの冒険" というデータが入っているレコードを探してくるメソッドです。
- そして、そのレコードを変数@bookに代入しています。
- Book.all は、全部のレコードを持って来るメソッドでしたが、【.find_by】は1つのレコードのみです。ここ注意です。
- 変数の名前(@book)を単数形にしているのも、1つのレコードだけだからです。
- Railsでは単数なのか?複数なのか?は重要ですので、変数名の付け方も意識しましょう。
- 一旦ページを確認しておきましょう。
- (確認するページは showページ ですね。URLの末尾に/index/showです)
- 下の画像のように本のタイトルだけ消えていたら成功です。
コントローラーの変更

- 本のタイトルが消えていますが、これはコントローラーで、@book_name という変数を削除して、@book に変えたので当然です。
- ビュー( app/views/books/show.html.rb )の方も変更してあげましょう。
- もし自分で出来そうであればやってみてください。
- index の時と同じように book に入っているレコードの、nameカラムを表示するだけです。
- 答えは次へ。
- 以下のようにすれば良いですね。
コントローラーの変更
- ちゃんと本の名前が表示されたか確認しましょう。
- さて、「本の名前」だけはデータベースから表示させることが出来ましたが、他のデータ【読んだ日】【評価】【感想】はデータベースを使っていません。
- これもデータベースに登録して、それを表示する方法に変える場合はどうしたら良いでしょうか?
- まず、現在 bookモデル には name というカラムしかありません(タイムスタンプは除く)ので、最初にしなくてはいけないことは【カラムの追加】です。
カラムを追加する
name | 【読んだ日】 | 【評価】 | 【感想】 | created_at | updated_at |
---|---|---|---|---|---|
ザリガニの冒険 | 2018/02/19 19:48 | 2018/02/19 19:48 | |||
ザリガニVS伊勢エビ | 2018/02/19 20:48 | 2018/02/19 20:48 | |||
ザリガニになる方法 | 2018/02/19 21:48 | 2018/02/19 21:48 |
カラムを3つ追加したい
- カラムの追加もコマンドで行います。次のページへ。
- 以下のコマンドを実行してください。
カラムを追加する
①
②
③
④
⑤
⑥
⑦
- ①Railsのコマンドという意味。
- ② g = generate(ジェネレート:生成する)という意味。
- ③ migration(マイグレーション)マイグレーションファイルを作るという意味。
- ④ AddColumnToBooks(アッド,カラム,トゥ,ブックス)Booksテーブルにカラムを追加するという意味。
- ⑤ 【date】カラムと【star】カラムと【impression】カラムを追加しています。
- 【date】カラムのみdate型(日時を入れるの型)を指定しています。
- ※:(コロン)の左がカラム名、右が型名です。
- それ以外はstring型良いので、何も指定していません。※指定がない場合はstring型になります。
- 【date】カラムのみdate型(日時を入れるの型)を指定しています。
- では、今のコマンドで作られたマイグレーションファイルを確認しましょう。
- db/migrare フォルダに、ファイルが増えているはずです。
カラムを追加する
- 前にBooksテーブルを作った時のマイグレーションファイル「数字_create_books.rb」も残っていますね?
- 誤解しがちなのですが、マイグレーションファイルは1つのファイルではなく、何か変更がある度に、その変更分を「足していく」ようにどんどん増えていきます。
- なので何度も変更していると、100以上のファイルが溜まっていったりもします。
- ただ、マイグレーションファイルは「過去の変更履歴」としての役割もあるため、このように溜めていくのが基本です。
- また、前にマイグレーション済(データベースに反映済)のマイグレーションファイルは絶対に変更しないでください。
- 例えば、前にマイグレーションした「数字_create_books.rb」を変更して、再度マイグレーションしたとしても、意味はありません。
- もし変更が必要になった場合は、再度、変更用のマイグレーションファイルを作る、という流れなので覚えておきましょう。
- 先ほど出来たファイルも見ておきます。
カラムを追加する
- add_column がポイントで、1つ目の引数は「追加するテーブル」、2つ目の引数は「追加するカラム名」、3つ目の引数は「カラムの型」になります。
- つまり「 add_column :books, :date, :date 」であれば「booksテーブルに」「dateというカラムを」「dateという型で」追加するという意味になります。
- では、実際にデータベースにマイグレーションしましょう。次へ。
- マイグレーションのコマンドは前と同じです。
カラムを追加する
- 以下のようになればOKです。
- これでカラムの追加は出来ましたが、まだデータがありませんので、また初期データを入れておきましょう。次へ。
- 初期データは db/seed.rbファイル でしたね。それを→の感じに修正しましょう。(赤枠のところを追加する)
- もちろん、文章は好きに変えてください。
- 尚、@book.date だけは date型 という型なので、ちょっと特殊な書き方です。
- Date.new()の引数として
- 第1引数に西暦の4桁
- 第2引数に月の2桁
- 第3引数に日の2桁
- という形式で数字を並べます。
- Date.new()の引数として
- つまり「 Date.new(2017, 01, 01) 」は 2017年1月1日 という事です。
- 月や日が1桁の数字でも 01 というように 0 を使って、必ず2桁にしないといけないので注意してください。
seedファイル
- ファイルを変更できたら、改めてseedファイルの内容をデータベースに反映させたいのですが、このまま【 rake db:seed 】とコマンドを叩くと、今の初期データに”追加”でデータが入ってしまいます。
- つまり、すでに入れている3つのレコードはそのままで、さらにレコードが3つ増えて、合計6つのレコードが入った状態になってしまいます。
- そのため、一旦データベースを白紙にしておきたいと思います。
- まずは下のコマンドを実行してください。
データベースのリセット
- これで、データベースがリセットされました。
- 次へ。
- では、改めて初期データを追加しましょう。
データベースのリセット
- 一応、rails c でデータベースの中身を確認しましょう。まずは Rails と対話できるように、 rails c をします。
- 次に Book.all でbooksテーブルのデータをすべて表示させます。
- ちゃんと date などのカラムが確認できたら quit で終了しましょう。
- データベースは出来たので、次はコントローラーを編集します。
- app/controllers/books_controller.rb を以下のように変更しましょう。(削除するだけですね)
コントローラー
- データはすべてデータベースの方に入れたので、コントローラーが非常にすっきりしましたね。
- このように「データはデータベース(モデル)」「処理はコントローラー」「画面に表示する内容はビュー」というように、分けて管理していくのがベストです。
- まだビューは変更していないのでビューも変更して、ちゃんと表示されるようにしましょう。※もし出来そうなら次ページを見ずにやってみましょう。
- app/views/books/show.html.erb を以下のように変更しましょう。
ビュー(show)
- ページも確認しておきましょう。(URLの末尾が/books/showのページですね)
- これで indexページ も showページ もデータベースからデータを表示させることができました。
お疲れ様です
- ここまでで、データベースからデータを取り出して表示する方法はわかりましたね。
- それ以外にも「テーブルの作成」「カラムの追加」「マイグレーション」「初期データを登録」「データベースをリセット」など、データベースの操作も学びました。
- ただ、現在は「1つ目の本」が表示できる showページしかありません。
- 2つ目の本や、3つ目の本は、indexページにしか表示されておらず、showページ で「感想」や「評価」などを詳しく見ることは出来ません。
- 次は showページに表示される内容を切り替えて、すべての本の詳しい情報を見れるようにする という事を行っていきます。
Ruby on Rails入門3
By kinocode
Ruby on Rails入門3
- 1,074