CodeKitchen

これからはじめるRuby on Rails

rails ruby

HTTPとRailsアプリケーションの全体像

まずは、Railsアプリケーションの全体像を示すフローチャートを見てみましょう。

ユーザーブラウザ/モバイルアプリRailsアプリケーションRouterControllerModelDatabaseView

このフローチャートは、ユーザーがブラウザを通じてRailsアプリケーションとやり取りする流れを示しています。

  1. ユーザーがブラウザでアクションを実行すると、リクエストがWebサーバーに送信されます。
  2. WebサーバーはリクエストをRailsアプリケーションに渡します。
  3. Railsアプリケーション内では、まずルーター(Router)がリクエストを受け取ります。
  4. ルーターは、リクエストに応じて適切なコントローラー(Controller)のアクションにルーティングします。
  5. コントローラーは、必要に応じてモデル(Model)と連携してデータベース操作を行います。
  6. モデルは、データベースからデータを取得したり、データを保存したりします。
  7. コントローラーは、取得したデータをビュー(View)に渡します。
  8. ビューは、受け取ったデータを使ってHTMLを生成し、レスポンスとしてブラウザに返します。

次に、HTTP メソッドごとのRailsアプリケーションの動きを、シーケンス図を使って説明していきます。

GET メソッド

ユーザーがブラウザで /users にアクセスし、ユーザー一覧を表示する場合のシーケンス図を見てみましょう。

ViewDatabaseUser (Model)UsersControllerRouterBrowserUserViewDatabaseUser (Model)UsersControllerRouterBrowserUser/usersにアクセスGET /usersindex アクションUser.allSELECT * FROM usersユーザーデータユーザーの配列@usersHTMLレスポンス (200 OK)ユーザー一覧を表示
  1. ユーザーがブラウザで /users にアクセスします。
  2. ブラウザがルーターに GET /users リクエストを送信します。
  3. ルーターが UsersControllerindex アクションにルーティングします。
  4. UsersControllerUser モデルに対して User.all を呼び出し、全ユーザーデータを取得します。
  5. User モデルがデータベースに対して SELECT クエリを発行します。
  6. データベースがユーザーデータを User モデルに返します。
  7. User モデルが取得したユーザーデータを UsersController に返します。
  8. UsersController がユーザーデータをビューに渡します。
  9. ビューがHTMLを生成し、UsersController に返します。
  10. UsersController がレスポンス(200 OK)をブラウザに返します。
  11. ブラウザがユーザー一覧をユーザーに表示します。

POST メソッド

ユーザーが新規ユーザー作成フォームを送信し、ユーザーを作成する場合のシーケンス図です。

ViewDatabaseUser (Model)UsersControllerRouterBrowserUserViewDatabaseUser (Model)UsersControllerRouterBrowserUseralt[保存成功][保存失敗]新規ユーザー作成フォームを送信POST /userscreate アクションUser.new(user_params)@user.saveINSERT INTO users (...)作成されたユーザーデータtrueリダイレクト (302 Found)作成されたユーザーページに移動false@userHTML (新規作成フォーム)レスポンス (200 OK)新規作成フォームを再表示
  1. ユーザーが新規ユーザー作成フォームを送信します。
  2. ブラウザがルーターに POST /users リクエストを送信します。
  3. ルーターが UsersControllercreate アクションにルーティングします。
  4. UsersControllerUser.new(user_params) で新しいユーザーインスタンスを作成します。
  5. UsersController@user.save を呼び出し、ユーザーをデータベースに保存します。
  6. User モデルがデータベースに対して INSERT クエリを発行します。
  7. データベースが作成されたユーザーデータを User モデルに返します。
  8. 保存が成功した場合、UsersController がリダイレクト(302 Found)をブラウザに返し、作成されたユーザーページに移動します。
  9. 保存が失敗した場合、UsersController が新規作成フォームのHTMLをブラウザに返し、フォームを再表示します。

PATCH/PUT メソッド

ユーザーがユーザー情報の編集フォームを送信し、ユーザー情報を更新する場合のシーケンス図です。

ViewDatabaseUser (Model)UsersControllerRouterBrowserUserViewDatabaseUser (Model)UsersControllerRouterBrowserUseralt[更新成功][更新失敗]ユーザー情報編集フォームを送信PATCH /users/:idupdate アクションUser.find(params[:id])SELECT * FROM users WHERE id = ?ユーザーデータユーザーインスタンス@user.update(user_params)UPDATE users SET ... WHERE id = ?更新されたユーザーデータtrueリダイレクト (302 Found)更新されたユーザーページに移動false@userHTML (編集フォーム)レスポンス (200 OK)編集フォームを再表示
  1. ユーザーがユーザー情報編集フォームを送信します。
  2. ブラウザがルーターに PATCH /users/:id リクエストを送信します。
  3. ルーターが UsersControllerupdate アクションにルーティングします。
  4. UsersControllerUser.find(params[:id]) で更新対象のユーザーを取得します。
  5. User モデルがデータベースに対して SELECT クエリを発行し、ユーザーデータを取得します。
  6. データベースがユーザーデータを User モデルに返します。
  7. User モデルがユーザーインスタンスを UsersController に返します。
  8. UsersController@user.update(user_params) を呼び出し、ユーザー情報を更新します。
  9. User モデルがデータベースに対して UPDATE クエリを発行します。
  10. データベースが更新されたユーザーデータを User モデルに返します。
  11. 更新が成功した場合、UsersController がリダイレクト(302 Found)をブラウザに返し、更新されたユーザーページに移動します。
  12. 更新が失敗した場合、UsersController が編集フォームのHTMLをブラウザに返し、フォームを再表示します。

DELETE メソッド

ユーザーがユーザー削除リンクをクリックし、ユーザーを削除する場合のシーケンス図です。

DatabaseUser (Model)UsersControllerRouterBrowserUserDatabaseUser (Model)UsersControllerRouterBrowserUserユーザー削除リンクをクリックDELETE /users/:iddestroy アクションUser.find(params[:id])SELECT * FROM users WHERE id = ?ユーザーデータユーザーインスタンス@user.destroyDELETE FROM users WHERE id = ?削除の確認ユーザーインスタンスリダイレクト (302 Found)ユーザー一覧ページに移動
  1. ユーザーがユーザー削除リンクをクリックします。
  2. ブラウザがルーターに DELETE /users/:id リクエストを送信します。
  3. ルーターが UsersControllerdestroy アクションにルーティングします。
  4. UsersControllerUser.find(params[:id]) で削除対象のユーザーを取得します。
  5. User モデルがデータベースに対して SELECT クエリを発行し、ユーザーデータを取得します。
  6. データベースがユーザーデータを User モデルに返します。
  7. User モデルがユーザーインスタンスを UsersController に返します。
  8. UsersController@user.destroy を呼び出し、ユーザーを削除します。
  9. User モデルがデータベースに対して DELETE クエリを発行します。
  10. データベースが削除の確認を User モデルに返します。
  11. User モデルがユーザーインスタンスを UsersController に返します。
  12. 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

フローチャート

YesNoマイグレーションファイルの生成マイグレーションファイルの編集マイグレーションの実行スキーマファイルの更新マイグレーションの取り消し?マイグレーションの取り消しマイグレーションの確認

このフローチャートは、Migrationのライフサイクルの主要なステップを示しています。

  1. マイグレーションファイルの生成
  2. マイグレーションファイルの編集
  3. マイグレーションの実行
  4. スキーマファイルの更新
  5. マイグレーションの取り消しの判断
  • Yes: マイグレーションの取り消し
  • No: マイグレーションの確認

シーケンス図

DatabaseRailsTerminalDeveloperDatabaseRailsTerminalDeveloperrails generate migrationマイグレーションファイルの生成マイグレーションファイルの生成完了マイグレーションファイルの生成完了マイグレーションファイルの編集マイグレーションファイルの編集内容の反映マイグレーションファイルの編集内容の反映完了マイグレーションファイルの編集完了rails db:migrateマイグレーションの実行データベーススキーマの変更データベーススキーマの変更完了マイグレーションの実行完了マイグレーションの実行完了rails db:rollbackマイグレーションの取り消しデータベーススキーマの変更の取り消しデータベーススキーマの変更の取り消し完了マイグレーションの取り消し完了マイグレーションの取り消し完了rails db:migrate:statusマイグレーションの確認マイグレーションの実行状況マイグレーションの実行状況

このシーケンス図は、開発者とターミナル、Rails、データベース間のやり取りを示しています。

  1. 開発者がターミナルで rails generate migration コマンドを実行し、マイグレーションファイルを生成します。
  2. 開発者がマイグレーションファイルを編集し、データベースの変更内容を定義します。
  3. 開発者がターミナルで rails db:migrate コマンドを実行し、マイグレーションを実行します。
  4. Railsがデータベースに対してスキーマの変更を適用します。
  5. 開発者がターミナルで rails db:rollback コマンドを実行し、マイグレーションを取り消す場合、Railsがデータベースに対してスキーマの変更を取り消します。
  6. 開発者がターミナルで rails db:migrate:status コマンドを実行し、マイグレーションの実行状況を確認します。

これらの図を使用することで、Migrationのライフサイクルの流れと、開発者とシステム間のやり取りを視覚的に理解することができます。 フローチャートは全体の流れを簡潔に示し、シーケンス図は各ステップにおける詳細なやり取りを表現しています。

Migrationのライフサイクルを理解することは、データベーススキーマの管理において重要です。 これらの図を参考にして、マイグレーションの生成、編集、実行、取り消し、確認の各ステップを適切に実行していきましょう。

logo

Web Developer。パフォーマンス改善、データ分析基盤、生成AIに興味があり。Next.js, Terraform, AWS, Rails, Pythonを中心に開発スキルを磨いています。技術に関して幅広く投稿していきます。