Ruby on Rails

入門3

  • さて前回までで、MVCフレームワークのMVCのうちの【V】と【C】である、
    1. view(ビュー)
    2. controller(コントローラー)
    • をカンタンにですが学びました。
  • viewとは、サイトに表示させる部分のこと、つまりは【 .erb 】ファイルのことでした。
    • viewsフォルダに入っていますね。
  • controllerとは、司令塔部分のことで、【 ◯◯_controller.rb 】ファイルのことでした。
    • controllersフォルダに入っていましたね。
  • 今回は、残りの重要な要素であるmodel(モデル)を学んでいきましょう。
  • モデルは主に「データベース(DB)」に関係します。
  • ある程度、本格的なサイトを作ろうとすると、データベースは必須です。
    • なのでまずはデータベースに関して簡単に学びます。次へ。

前回のおさらい

  • さて、そもそも【データベース】とはなぜ必要なのでしょうか?その点から理解しておきましょう。
  • よく使われる例えで言います。
    • ある友達(友達1)に電話番号を教えてもらいました。トムはそれを【チラシ1のうら】にメモっておきました。
      • [てつお:090-1000-1000]みたいな感じです。 
    • さらに別の友達(友達2)にも電話番号を教えてもらいました。トムはそれを【チラシ2のうら】にメモっておきました。 
    • さらに別の友だち(友達3)にも、さらに別の友達(友達4)にも…というように電話番号が増えていき、気づくとチラシだらけになってしまいました
    • このままでは、てつおに電話かけたい時に、どのチラシに書いたのか見つけるのが大変です。
    • さらに間違ってチラシを捨ててしまう可能性もあります。
    • これはヤバイと思ったトムは【ノート】を買ってきて、電話番号と名前をすべてそのノートにまとめました。
  • この電話番号をまとめたノート(電話帳)のことが【データベース】です。
    • 実はデータベースとは、これだけの事なのです。めちゃカンタンですよね。

データベースとは

  • 電話帳を例に、もう少しデータベースの理解を深めましょう。
  • 多くの友達の電話番号を保存していくためには、電話帳にはどんな感じで書けば良いでしょうか?

データベースとは

  • 普通に書くと左の感じです。
  • ただ【名前】と【電話番号】というのが何度も書かれていて、ムダが多い気がしますね。
  • これをもっとまとめましょう。
    • 次のページに続きます。
  • 以下は改良版です。このように【枠(わく)】を作ってしまえば、イチイチ【名前】と【電話番号】は書かなくても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型になります。
  • では、今のコマンドで作られたマイグレーションファイルを確認しましょう。
  • 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(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