やること
大量の機能を自動的に生成するscaffoldジェネレータというスクリプトを使ってtoyアプリケーション作成
2.1 アプリケーションの計画
rails newでrailsのバージョンを指定しながらアプリの骨組みを生成
$ cd ~/environment
$ rails 7.0.4 new toy_app --skip-bundle
$ cd toy_app/
リスト2.1 bundlerで扱うgemfileを編集
bundle config set --local without 'production'オプションで本番用のgemを除いたローカルgemをインストールできる
$ bundle 2.3.14 config set --local without 'production'
$ bundle 2.3.14 install
うまく動かなかったらbundle update
The dependency tzinfo-dataの警告メッセは無視して問題ない
リスト2.2 applicationコントローラにhelloアクション追加
リスト2.3 ルートルーティングを設定
リスト2.4 ローカルのwebサーバーに接続できるように
gitのバージョン管理下に置く
$ git init
$ git add -A
$ git commit -m "Add hello"
github上に新しいリポジトリ作成し、生成したファイルをプッシュする
$ git remote add origin https://github.com/<あなたのGitHubアカウント名>/toy_app.git
$ git push -u origin main
2.1.1 ユーザーのモデル設計
アプリケーションの構造を表すデータモデルを最初に設計しておく
toy_appではユーザーと短いマイクロポストのみを扱うので、UserモデルとMicropostモデルについて考えていく
図2.2 各ユーザーには、重複のない一意のキーとなるinteger型のID番号(idと呼ぶ)、一般公開されるstring型の名前(name)、string型のメールアドレスを持たせる。メールアドレスはユーザー名としても扱われる
ユーザーはテーブル、id、name、emailはテーブルのカラム(column:列)と呼ぶ
2.1.2 マイクロポストのモデル設計
マイクロポストとは短い投稿のこと
図2.3 idとtext型のcontentで構成される
しかし、ユーザーと関連付ける(associate)必要があるので投稿者を記録するためのuser_idも追加する
2.2 Usersリソース
ユーザー用のデータモデルを、そのモデルを表示させるためのwebインターフェイスに従って実装する
これらは組み合わさってUsersリソースとなり、ユーザーをHTTPプロトコル経由で自由に作成、取得、更新、削除できるオブジェクトとみなすことができるようになる
$ rails generate scaffold User name:string email:string
scaffoldコマンドの引数にはリソース名を単数形にしたもの(今回はUser)を使い、データモデルの属性をオプションとしてパラメータに追加する
name:stringとemail:stringオプションを追加
idはrailsによって自動的に主キーとしてDBに追加される
リスト2.5 rails db:migrateでDBをマイグレートする
DBを更新してusersデータテーブルを作成する
2.2.1 ユーザーページを探検する
表2.1 Usersリソースをscaffoldで生成したことでユーザー関連ページが多数追加されている
/users index すべてのユーザーを一覧するページ
/users/1 show id=1のユーザーを表示するページ
/users/new new 新規ユーザーを作成するページ
/users/1/edit edit id=1のユーザーを編集するページ
2.2.2 MVCの挙動
Usersリソースの挙動をMVC(モデル・ビュー・コントローラ)パターンから見てみる
/usersにあるindexページをブラウザで開くときの内部の挙動
-
ブラウザから/usersというURLのリクエストをRailsサーバーに送信する(アドレスバーにURLを入力したり、リンクをクリックしたときに発生)
-
/usersリクエストは、railsのルーティング機構(ルーター)に到達し、URLに基づいて適切なコントローラ(今回はUsersコントローラ)内のindexアクションに割り当てられる
-
indexアクションが実行され、Userモデルに全てのユーザーを取り出せ(User.all)と問い合わせる
-
Userモデルは問い合わせを受け、全てのユーザーをDBから取り出す
-
DBから取り出したユーザーの一覧をUserモデルからコントローラに返す
-
Usersコントローラはユーザーの一覧を@users変数(@はRubyのインスタンス変数)に保存しindexビューに渡す
-
indexビューが起動しERB(Embedded Ruby:ビューのHTMLに埋め込まれているRubyコード)を実行してHTMLを生成する
-
コントローラは、ビューで生成されたHTMLを受け取り、ブラウザに返す
リスト2.6 ユーザーからリクエストされたURLを、Usersリソースで使うコントローラのアクションに割り当てるためのコード
config/routes.rbで、URLとアクションの組み合わせを設定していく
リスト2.7 ルートからusersへのルーティング
/にアクセスするとUsersコントローラのindexアクションが実行されるようになる
リスト2.8 Usersコントローラ内のアクションの骨格
表2.2 アクションとURLとHTTPリクエストメソッド
リスト2.9 Userモデルから全てのユーザー一覧を取り出し@users変数に保存する
リスト2.10 Userモデル
継承により多くの機能が備わっている
リスト2.11 usersのindexアクションに対応しているビュー
Railsのコントローラ内で宣言したインスタンス変数はビューでも使えるようになる
2.2.3 Usersリソースの欠点
・データの検証が行われていない
このままではユーザー名が空欄でも、出鱈目なメールアドレスでも登録されてしまう
・ユーザー認証が行われていない
ログイン、ログアウトが行われていないので誰でも操作できてしまう
・テストが書かれていない
データ検証やユーザー認証など必要な要求を満たしていない
・レイアウトやスタイルが整っていない
デザインも操作方法も一貫していない
・理解が困難
2.3 Micropostsリソース
Usersリソースの次はMicropostsリソースを見ていく
UsersリソースとMicropostsリソースの構造の類似点を理解する
2.3.1 マイクロポストを探検する
scaffoldでMicropostsリソース生成
$ rails generate scaffold Micropost content:text user_id:integer
新しいデータモデルでDBを更新するには、マイグレーションを実行する
$ rails db:migrate
リスト2.12 Railsルートで使うMicropostsリソース用のルール
表2.3 MicropostsリソースのHTTPリクエストメソッド URL アクション 用途
リスト2.13 Micropostsコントローラの骨格
Usersコントローラと完全に同一
マイクロポストのインデックスページで実際にマイクロポストをいくつか作ってみる
2.3.2 マイクロポストをマイクロにする
マイクロポストに文字数制限を与えてみる
リスト2.14 最大140字にする
app/models/micropost.rb
validates :content, length: { maximum: 140 }
2.3.3 ユーザーはたくさんマイクロポストを持っている
異なるデータモデル同士の関連付けはrailsの強力な機能
今回はUserモデルとMicropostsモデルを関連づけ
リスト2.15 1人のユーザーに対し複数のマイクロポスト
app/model/user.rb
has_many :microposts
リスト2.16 1つのマイクロポストは1人のユーザーにのみ属する
app/model/micropost.rb
belongs_to :user
リスト2.17 railsコンソールでアプリケーションの状態を調べる
$ rails console
first_user = User.first
first_userに1人目のユーザーを代入
first_user
first_userを表示する
first_user.microposts
first_userの投稿を表示する
micropost = first_user.microposts.first
micropostにfirst_userに1つ目の投稿を代入
2.3.4 継承の階層
Railsのコントローラとモデルのクラス階層について
リスト2.20 2.21 図2.20 モデルの継承構造
User < ApplicationRecord < ActiveRecord::Base
リスト2.22 2.23 2.24 図2.21 コントローラの継承構造
Users < ApplicationController < ActionController::Base
2.4 最後に
2.4.1 まとめ
・scaffoldでコードを自動生成すると、Web上からデータモデルにアクセスし、やりとりできるようになる
・scaffoldは素早く開発するための機能で、学習用ではないため、scaffoldだけではrailsを理解するのは難しい
・railsでは、webアプリケーションの構成にMVC(model-view-controller)というアーキテクチャを採用している
・railsでは、HTTP requestメソッドと送信先(url)に応じて、呼び出されるコントローラやアクションが決まる
・railsでは、データのバリデーション(validation)がサポートされており、データモデルの値に制限をかけられる
・railsには、データモデル同士を関連付けするための様々なメソッド(has_manyなど)が用意されている
・railsコンソールを使うと、コマンドラインからrailsアプリを操作できる