Ruby on Railsの基本の基本
参考書籍「Railsの教科書」を読んで、実装する
フィヨルドブートキャンプでRailsの教科書を読んで、Ruby on Railsの基本を理解するというプラクティスに取り組んでいました!
「Railsの教科書」の構成について
- はじめに
- Webアプリをまずはつくってみよう
- 一番小さなRailsアプリづくり
- CRUDの基礎とindexアクション
- new, create アクション
- モデル
- Gemライブラリ
- 画像アップロード機能の追加
- あとがき
ご存知ない方のためにご紹介しますが、書籍は上記のような構成になっています。
私はこの書籍に取り組む前にProgateのRailsチュートリアルを2周程繰り返していたのですが、それでも色々と学びがありました。 本記事はその新たな学びを中心にまとめた記事になります。
MVCフレームワークの基本などについては本記事では触れませんのでご了承ください。
CRUDについて
CRUDとはそれぞれ、Create(作成)、Read(読み込み)、Update(更新)、Destroy(略称)を指し、Webアプリの基本となる機能を表しています。
以前の記事で登場した「Webを支える技術」の中でも、HTTPメソッドの開設時にCRUDとの対応について触れられていました。
CRUD名 | 意味 | HTTPメソッド |
---|---|---|
Create | ページの新規作成 | POST/PUT |
Read | 読み込み | GET |
Update | 更新 | PUT |
Delete | 削除 | DELETE |
scaffoldについて
この主要な4機能を一度に作成するコマンドがrails g scaffold
です。
scaffoldコマンドで生成したファイル群を編集して、自分たち用にアプリケーションを作成するイメージです。
一覧、新規作成ページ、詳細画面、編集画面に対応するerbファイルも自動で生成されているのがわかりますよね。
もちろん、RouteやControllerのファイルの中身を自ら記述しないといけないですが、以前使用したSinatraと比べるとかなり便利ですね。
Model(モデル)について
Progateのチュートリアルに取り組んでいる際などに少し疑問に感じていたのが、Rails内で定義される変数のスコープです。
ローカル変数はメソッド内、インスタンス変数についてはインスタンスオブジェクト内でしか使用できないはずです。
複数のリクエスト(ブラウザによるリクエストのこと)を実行するにも関わらず、以前のリクエストで実行した際の変数(データ)が参照できるのは、 実はある仕組みのお陰です。
それがModel(モデル)です!
Model(モデル)クラスの定義とファイルの生成について
Modelが定義されているファイルが存在するのはapp/models
内です。
実は先程のscaffoldコマンドを実行する際に、モデルとDBの設計図も同時に生成されています。
scaffoldコマンドで、以下の2種類のファイルが生成されているのがわかります。
app/models/book.rb
というModelファイルdb/migrate/20190427072108_create_books.rb
というMigrationファイル(DBの設計図)
Modelファイルの中を確認すると以下のような記述があります。
モデル(クラス)は①英語の単数形②大文字始まりで定義されます。
上記のようにApplicationRecordのクラスを継承しているため、定義していないsaveやallなどのメソッドが実行できるという訳です。
Rubyを学習している際に継承について習いましたが、このように使われていたのですね!
Modelの使い方
- Modelオブジェクトの生成
book = Book.new(title: "シャイニング", memo: "スティーブン・キングの同名ホラー小説")
クラス.new
でモデルオブジェクトを作ります。
- Model(モデル)オブジェクトの保存
book.save #saveメソッドの実行により保存
定義したモデルオブジェクトをsave
メソッドで保存します。
では、オブジェクトのデータを読み込みたいときは、どうするのでしょうか?
- Modelオブジェクトの読み込み
books = Book.all #全データ取得
to_a
メソッド(配列への変換メソッド)を用いてBook.all.to_a
とすると、配列で全データが取得可能となります。
DBとの関連について
rails g scaffold book title:string memo:text
のコマンドでは、DBのテーブル名(book
)とカラム名(title
とmemo
)、そしてカラムのデータ型(string
とtext
)を宣言しています。
実は、ApplicationRecord(クラス)はDBから情報を得て、定義したBookモデルにtitle、memoという項目があることを把握しているのです。
したがって、ApplicationRecordを継承しているモデル(Book)はbook.title
やbook.memo
といったDB内の項目を利用したメソッドの実行が可能なのです。
以上のことから、
- ModelはDBに簡単にアクセスできる仕組み
- Modelの仕組みを利用することで、Railsの利用者はDBからデータを比較的簡単に取得できる
DBは通常セキュリティの観点から簡単にアクセスすることが難しく、また通常SQLなどDBの専用言語を用いてデータを取得するのですが、 Modelを利用することでRubyを用いながらDBのデータを取得して利用することが可能となるのです。
メソッドなどをどこから利用しているのか疑問でしたが、やっと理解できました。
最後に
以前からRails内で利用する変数のスコープとメソッドについて疑問を感じていたのですが、今回のプラクティスにより解消されて理解が深まりました!
今後Railsに本格的に取り組むため、記事の中で色々学びをご紹介できればと思います。
以上となります!