Webとデザインのあれこれ

プログラミングとUIデザインの学習記録です。

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メソッドの対応関係
CRUD 意味 HTTPメソッド
Create ページの新規作成 POST/PUT
Read 読み込み GET
Update 更新 PUT
Delete 削除 DELETE

scaffoldについて

この主要な4機能を一度に作成するコマンドがrails g scaffoldです。

scaffoldコマンドで生成したファイル群を編集して、自分たち用にアプリケーションを作成するイメージです。

f:id:b_leiu:20190427193326p:plain

一覧、新規作成ページ、詳細画面、編集画面に対応するerbファイルも自動で生成されているのがわかりますよね。

もちろん、RouteやControllerのファイルの中身を自ら記述しないといけないですが、以前使用したSinatraと比べるとかなり便利ですね。

Model(モデル)について

Progateのチュートリアルに取り組んでいる際などに少し疑問に感じていたのが、Rails内で定義される変数のスコープです。

ローカル変数はメソッド内、インスタンス変数についてはインスタンスオブジェクト内でしか使用できないはずです。

複数のリクエスト(ブラウザによるリクエストのこと)を実行するにも関わらず、以前のリクエストで実行した際の変数(データ)が参照できるのは、 実はある仕組みのお陰です。

それがModel(モデル)です!

Model(モデル)クラスの定義とファイルの生成について

Modelが定義されているファイルが存在するのはapp/models内です。

実は先程のscaffoldコマンドを実行する際に、モデルとDBの設計図も同時に生成されています。

f:id:b_leiu:20190427194953p:plain

scaffoldコマンドで、以下の2種類のファイルが生成されているのがわかります。

  • app/models/book.rbというModelファイル
  • db/migrate/20190427072108_create_books.rbというMigrationファイル(DBの設計図)

Modelファイルの中を確認すると以下のような記述があります。

f:id:b_leiu:20190427195144p:plain

モデル(クラス)は①英語の単数形②大文字始まりで定義されます。

上記のように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)とカラム名(titlememo)、そしてカラムのデータ型(stringtext)を宣言しています。

実は、ApplicationRecord(クラス)はDBから情報を得て、定義したBookモデルにtitle、memoという項目があることを把握しているのです。

したがって、ApplicationRecordを継承しているモデル(Book)はbook.titlebook.memo といったDB内の項目を利用したメソッドの実行が可能なのです。

以上のことから、

  • ModelはDBに簡単にアクセスできる仕組み
  • Modelの仕組みを利用することで、Railsの利用者はDBからデータを比較的簡単に取得できる

DBは通常セキュリティの観点から簡単にアクセスすることが難しく、また通常SQLなどDBの専用言語を用いてデータを取得するのですが、 Modelを利用することでRubyを用いながらDBのデータを取得して利用することが可能となるのです。

メソッドなどをどこから利用しているのか疑問でしたが、やっと理解できました。

最後に

以前からRails内で利用する変数のスコープとメソッドについて疑問を感じていたのですが、今回のプラクティスにより解消されて理解が深まりました!

今後Railsに本格的に取り組むため、記事の中で色々学びをご紹介できればと思います。

以上となります!