これからはじめるRuby on Rails
rails rubyHTTPとRailsアプリケーションの全体像
まずは、Railsアプリケーションの全体像を示すフローチャートを見てみましょう。
このフローチャートは、ユーザーがブラウザを通じてRailsアプリケーションとやり取りする流れを示しています。
- ユーザーがブラウザでアクションを実行すると、リクエストがWebサーバーに送信されます。
- WebサーバーはリクエストをRailsアプリケーションに渡します。
- Railsアプリケーション内では、まずルーター(Router)がリクエストを受け取ります。
- ルーターは、リクエストに応じて適切なコントローラー(Controller)のアクションにルーティングします。
- コントローラーは、必要に応じてモデル(Model)と連携してデータベース操作を行います。
- モデルは、データベースからデータを取得したり、データを保存したりします。
- コントローラーは、取得したデータをビュー(View)に渡します。
- ビューは、受け取ったデータを使ってHTMLを生成し、レスポンスとしてブラウザに返します。
次に、HTTP メソッドごとのRailsアプリケーションの動きを、シーケンス図を使って説明していきます。
GET メソッド
ユーザーがブラウザで /users
にアクセスし、ユーザー一覧を表示する場合のシーケンス図を見てみましょう。
- ユーザーがブラウザで
/users
にアクセスします。 - ブラウザがルーターに GET
/users
リクエストを送信します。 - ルーターが
UsersController
のindex
アクションにルーティングします。 UsersController
がUser
モデルに対してUser.all
を呼び出し、全ユーザーデータを取得します。User
モデルがデータベースに対してSELECT
クエリを発行します。- データベースがユーザーデータを
User
モデルに返します。 User
モデルが取得したユーザーデータをUsersController
に返します。UsersController
がユーザーデータをビューに渡します。- ビューがHTMLを生成し、
UsersController
に返します。 UsersController
がレスポンス(200 OK)をブラウザに返します。- ブラウザがユーザー一覧をユーザーに表示します。
POST メソッド
ユーザーが新規ユーザー作成フォームを送信し、ユーザーを作成する場合のシーケンス図です。
- ユーザーが新規ユーザー作成フォームを送信します。
- ブラウザがルーターに POST
/users
リクエストを送信します。 - ルーターが
UsersController
のcreate
アクションにルーティングします。 UsersController
がUser.new(user_params)
で新しいユーザーインスタンスを作成します。UsersController
が@user.save
を呼び出し、ユーザーをデータベースに保存します。User
モデルがデータベースに対してINSERT
クエリを発行します。- データベースが作成されたユーザーデータを
User
モデルに返します。 - 保存が成功した場合、
UsersController
がリダイレクト(302 Found)をブラウザに返し、作成されたユーザーページに移動します。 - 保存が失敗した場合、
UsersController
が新規作成フォームのHTMLをブラウザに返し、フォームを再表示します。
PATCH/PUT メソッド
ユーザーがユーザー情報の編集フォームを送信し、ユーザー情報を更新する場合のシーケンス図です。
- ユーザーがユーザー情報編集フォームを送信します。
- ブラウザがルーターに PATCH
/users/:id
リクエストを送信します。 - ルーターが
UsersController
のupdate
アクションにルーティングします。 UsersController
がUser.find(params[:id])
で更新対象のユーザーを取得します。User
モデルがデータベースに対してSELECT
クエリを発行し、ユーザーデータを取得します。- データベースがユーザーデータを
User
モデルに返します。 User
モデルがユーザーインスタンスをUsersController
に返します。UsersController
が@user.update(user_params)
を呼び出し、ユーザー情報を更新します。User
モデルがデータベースに対してUPDATE
クエリを発行します。- データベースが更新されたユーザーデータを
User
モデルに返します。 - 更新が成功した場合、
UsersController
がリダイレクト(302 Found)をブラウザに返し、更新されたユーザーページに移動します。 - 更新が失敗した場合、
UsersController
が編集フォームのHTMLをブラウザに返し、フォームを再表示します。
DELETE メソッド
ユーザーがユーザー削除リンクをクリックし、ユーザーを削除する場合のシーケンス図です。
- ユーザーがユーザー削除リンクをクリックします。
- ブラウザがルーターに DELETE
/users/:id
リクエストを送信します。 - ルーターが
UsersController
のdestroy
アクションにルーティングします。 UsersController
がUser.find(params[:id])
で削除対象のユーザーを取得します。User
モデルがデータベースに対してSELECT
クエリを発行し、ユーザーデータを取得します。- データベースがユーザーデータを
User
モデルに返します。 User
モデルがユーザーインスタンスをUsersController
に返します。UsersController
が@user.destroy
を呼び出し、ユーザーを削除します。User
モデルがデータベースに対してDELETE
クエリを発行します。- データベースが削除の確認を
User
モデルに返します。 User
モデルがユーザーインスタンスをUsersController
に返します。UsersController
がリダイレクト(302 Found)をブラウザに返し、ユーザー一覧ページに移動します。
以上が、HTTP メソッドごとのRailsアプリケーションの動きを示すシーケンス図です。 これらの図を通して、リクエストがどのようにルーティングされ、コントローラー、モデル、ビューが連携してレスポンスを生成するかを理解することができます。
Railsアプリケーションのディレクトリ構造
Railsアプリケーションの標準的なディレクトリ構造は以下のようになっています。各ディレクトリとファイルの役割を理解することで、効率的な開発を行うことができます。
.
├── Dockerfile # Dockerコンテナの設定を記述するファイル
├── Gemfile # Rubyの依存関係(gem)を管理するファイル
├── Gemfile.lock # Gemfileの依存関係のバージョンを固定するファイル
├── Procfile.dev # 開発環境でのプロセス(サーバー、ジョブなど)の設定を記述するファイル
├── README.md # アプリケーションの概要や使い方を説明するドキュメント
├── Rakefile # Rakeタスク(コマンドラインから実行できるタスク)の定義ファイル
├── app # Railsアプリケーションの中心となるディレクトリ(MVC)
│ ├── assets # CSS、JavaScript、画像などの静的アセットファイルを格納するディレクトリ
│ ├── channels # Action Cableのチャンネル(リアルタイム通信)に関するファイルを格納するディレクトリ
│ ├── controllers # コントローラー(リクエストを処理し、モデルとビューを制御する)に関するファイルを格納するディレクトリ
│ ├── helpers # ビューヘルパー(ビューで使用する便利なメソッド)に関するファイルを格納するディレクトリ
│ ├── javascript # Railsアプリケーションで使用するJavaScriptファイル(Stimulusなど)を格納するディレクトリ
│ ├── jobs # Active Job(バックグラウンドジョブ)に関するファイルを格納するディレクトリ
│ ├── mailers # Action Mailer(メール送信)に関するファイルを格納するディレクトリ
│ ├── models # モデル(データベースとのやり取りを担当する)に関するファイルを格納するディレクトリ
│ └── views # ビュー(HTMLテンプレート)に関するファイルを格納するディレクトリ
├── bin # Railsアプリケーションを実行するためのスクリプトを格納するディレクトリ
│ ├── bundle # Bundler(gemの依存関係を管理するツール)のラッパースクリプト
│ ├── dev # 開発環境用のスクリプト
│ ├── docker-entrypoint # Dockerエントリーポイントのスクリプト
│ ├── importmap # Import Map(JavaScriptモジュールの依存関係を管理する仕組み)に関するスクリプト
│ ├── rails # Railsコマンドラインインターフェイスのスクリプト
│ ├── rake # Rakeタスクを実行するためのスクリプト
│ └── setup # セットアップ用のスクリプト
├── config # Railsアプリケーションの設定ファイルを格納するディレクトリ
│ ├── application.rb # アプリケーション全体の設定を記述するファイル
│ ├── boot.rb # Railsアプリケーションの起動プロセスを設定するファイル
│ ├── cable.yml # Action Cableの設定ファイル
│ ├── credentials.yml.enc # 暗号化された認証情報を格納するファイル
│ ├── database.yml # データベース接続の設定ファイル
│ ├── environment.rb # 環境に依存しない共通の設定を記述するファイル
│ ├── environments # 環境ごと(development、test、production)の設定ファイルを格納するディレクトリ
│ ├── importmap.rb # Import Mapの設定ファイル
│ ├── initializers # 初期化プロセスで実行されるスクリプトを格納するディレクトリ
│ ├── locales # 多言語対応のためのロケールファイルを格納するディレクトリ
│ ├── master.key # credentials.yml.encを復号化するための鍵ファイル
│ ├── puma.rb # Pumaサーバーの設定ファイル
│ ├── routes.rb # ルーティングの設定ファイル
│ ├── storage.yml # Active Storageの設定ファイル
│ └── tailwind.config.js # Tailwind CSSの設定ファイル
├── config.ru # Rack(Webサーバーとアプリケーションの間のインターフェース)の設定ファイル
├── db # データベース関連のファイルを格納するディレクトリ
│ ├── migrate # マイグレーションファイル(データベースのスキーマを変更するためのファイル)を格納するディレクトリ
│ ├── schema.rb # データベースのスキーマ情報を記述するファイル
│ └── seeds.rb # 初期データを投入するためのファイル
├── lib # アプリケーション固有のライブラリやタスクを格納するディレクトリ
│ ├── assets # カスタムアセットファイルを格納するディレクトリ
│ └── tasks # カスタムRakeタスクを格納するディレクトリ
├── log # アプリケーションのログファイルを格納するディレクトリ
│ └── development.log # 開発環境のログファイル
├── public # 静的なファイルを格納するディレクトリ
│ ├── 404.html # 404エラー(Not Found)ページのHTMLファイル
│ ├── 422.html # 422エラー(Unprocessable Entity)ページのHTMLファイル
│ ├── 500.html # 500エラー(Internal Server Error)ページのHTMLファイル
│ ├── apple-touch-icon-precomposed.png # iOSデバイス用のアイコン画像(プリコンポーズ)
│ ├── apple-touch-icon.png # iOSデバイス用のアイコン画像
│ ├── favicon.ico # ファビコン(ブラウザのタブに表示されるアイコン)
│ └── robots.txt # 検索エンジンのクローラーに対する指示を記述するファイル
├── storage # Active Storageに関連するファイルを格納するディレクトリ
│ ├── development.sqlite3 # 開発環境のActive Storage用SQLiteデータベースファイル
│ └── test.sqlite3 # テスト環境のActive Storage用SQLiteデータベースファイル
├── tmp # 一時的なファイルを格納するディレクトリ
│ ├── cache # キャッシュファイルを格納するディレクトリ
│ ├── local_secret.txt # ローカル環境の秘密鍵ファイル
│ ├── pids # プロセスIDファイルを格納するディレクトリ
│ ├── restart.txt # アプリケーションの再起動をトリガーするファイル
│ ├── sockets # ソケットファイルを格納するディレクトリ
│ └── storage # 一時的なストレージファイルを格納するディレクトリ
└── vendor # サードパーティのコードやライブラリを格納するディレクトリ
├── bundle # Bundlerで管理されるgemを格納するディレクトリ
└── javascript # サードパーティのJavaScriptライブラリを格納するディレクトリ
以上が、Railsアプリケーションの主要なディレクトリとファイルの構成です。 この標準的な構造に従ってコードを配置することで、アプリケーションの保守性や可読性が向上します。 また、Railsの規約に従うことで、他の開発者とのコードの共有や引き継ぎがスムーズになります。
Migration
フローチャート
このフローチャートは、Migrationのライフサイクルの主要なステップを示しています。
- マイグレーションファイルの生成
- マイグレーションファイルの編集
- マイグレーションの実行
- スキーマファイルの更新
- マイグレーションの取り消しの判断
- Yes: マイグレーションの取り消し
- No: マイグレーションの確認
シーケンス図
このシーケンス図は、開発者とターミナル、Rails、データベース間のやり取りを示しています。
- 開発者がターミナルで
rails generate migration
コマンドを実行し、マイグレーションファイルを生成します。 - 開発者がマイグレーションファイルを編集し、データベースの変更内容を定義します。
- 開発者がターミナルで
rails db:migrate
コマンドを実行し、マイグレーションを実行します。 - Railsがデータベースに対してスキーマの変更を適用します。
- 開発者がターミナルで
rails db:rollback
コマンドを実行し、マイグレーションを取り消す場合、Railsがデータベースに対してスキーマの変更を取り消します。 - 開発者がターミナルで
rails db:migrate:status
コマンドを実行し、マイグレーションの実行状況を確認します。
これらの図を使用することで、Migrationのライフサイクルの流れと、開発者とシステム間のやり取りを視覚的に理解することができます。 フローチャートは全体の流れを簡潔に示し、シーケンス図は各ステップにおける詳細なやり取りを表現しています。
Migrationのライフサイクルを理解することは、データベーススキーマの管理において重要です。 これらの図を参考にして、マイグレーションの生成、編集、実行、取り消し、確認の各ステップを適切に実行していきましょう。