はじめに
概要
この記事では、Ruby on Railsを利用したWebアプリケーション開発の初歩を学びます。具体的には、Webブラウザを通じてデータを操作するための基本的な概念と、Railsでのデータ操作の設計手法に焦点を当てます。RESTfulな設計の基礎、ルーティングの設定、およびモデルとコントローラーの連携方法について、段階的に学んでいきます。
目標
- Webブラウザを通じたデータ操作の基本を理解する。
- RailsでRESTfulな設計の基礎を学ぶ。
- ルーティング、モデル、コントローラの基本的な連携方法を理解する。
必要な前提条件・事前準備
これまでデータベース操作を集中して学習してきたため、employee_management
アプリケーションでの画面操作は久しぶりの機会となります。そのため、「Webの基本からRailsでのページ作成まで学ぼう」を復習しておくことで、本章をより深く理解できるでしょう。
- 「Webの基本からRailsでのページ作成まで学ぼう」の復習(任意)
1.Webブラウザを介したCRUD操作の重要性
Railsでの開発について、これまで学んできた内容を振り返ってみましょう。
Ruby on Railsは、アプリケーションをモデル(データの処理)、ビュー(ユーザーインターフェース)、コントローラー(処理の流れ制御)の3つの要素に分ける「MVCアーキテクチャ」を採用しています。この仕組みは、アプリケーションの各要素が特定の役割を担い、効率的に連携するよう設計されています。
以下は、MVCアーキテクチャにおけるリクエストからレスポンスまでの全体の流れです。
データベースとのやり取りは、主にモデルが担当します。Railsでは、モデル内で特定のクラスを定義することで、Active Recordという機能を利用できます。これにより、データベース操作をより効率的かつ直感的に行うことが可能になるということを学んできましたね。
ActiveRecordを利用することで、データベースのレコードをRubyのオブジェクトとして扱えます。これにより、CRUD操作をRubyのコードを通じて簡単に実行できるようになります。
CRUDは、データベースのレコードに対する基本的な四つの操作(作成、読み取り、更新、削除)を指します。Railsでは、これらの操作はActiveRecordを介してモデルクラスを通じて行われます。CRUD操作とそれに対応するActiveRecordのメソッドは、以下の表の通りです。
CRUD | 説明 | ActiveRecordのメソッド |
---|---|---|
Create | データベースのテーブルに新しいレコードを追加する | create, new + save |
Read | テーブル内の既存のレコードを検索し、取得する | all, find, find_by, where |
Update | テーブル内の特定のレコードを検索し、その内容を変更する | update |
Delete | テーブルから特定のレコードを削除する | destroy, destroy_all |
例えば、UserモデルクラスのインスタンスにActiveRecordのsaveメソッドを適用することで、テーブルに新しいデータを挿入することができます。
これまでの学習内容では、主にモデルとデータベース間でのCRUD操作を学んできました。
しかし、実際のアプリケーション利用時には、ユーザーがWebブラウザ上の画面を通じてデータの登録、更新、削除などの操作を行うのが一般的です。このため、ユーザーがデータ操作を行えるように画面の作成と処理が必要です。これらの画面を提供することで、ユーザーは直接データベースにアクセスすることなく、必要なデータ操作を行えるようになります。
Railsでは、ユーザーがフォームやボタンを使用してデータを操作できる画面を簡単に作成することができます。これらの画面の作成は、MVCアーキテクチャに沿って行われます。加えて、Railsは「REST」と呼ばれる特定の設計思想を採用しており、これに従ってアプリケーションを設計することで、より効率的でわかりやすい実装が可能になります。
実装に入る前に、RailsにおけるRESTの基礎を学習しましょう。
2.RailsにおけるRESTの基礎
Railsでは、設計の基本的な考え方として「REST(Representational State Transfer)」が採用されています。RESTは、Web上の情報や機能を「リソース」として捉え、リソースを中心に物事を考える「リソース指向アーキテクチャ」をベースにした一連の設計原則です。
いろんな新しい用語が出てきて、理解できるか少し不安だなぁ...。
心配しないで、ぴっかちゃん。今からRESTに関連する用語を一つずつ確認していくよ。最終的には、RailsでのRESTの全体像がクリアになるはずだからね。
リソース指向アーキテクチャとは
リソース指向アーキテクチャ(Resource Oriented Architecture、略してROA)とは、Webサービスにおいて、基本的なデータや情報を「リソース」として中心に据えるアーキテクチャのことです。
リソースとは、簡単に言うとWeb上に存在する情報や機能のことを指します。Railsでは、処理の対象となる共通点を持つ情報の集まり、例えばデータベースの「テーブル」をリソースとして捉えるのが一般的です。
そして、すべてのリソースは、URI(Uniform Resource Identifier)によって一意に名付けられます。このURIは、Web上のリソースを特定する文字列であり、リソースの「名前」と「アドレス(住所)」の両方を表しています。URIを見ることで、どのリソースが参照されるかを判断できるようになります。
例えば、Railsアプリケーションにおいて、/employees
というURIがあるとします。このURIを見るだけで、employees
というリソース、つまりデータベース内のemployees
テーブルに関連していることが分かります。
同様に、/employees/1
というURIを見れば、employees
テーブルのid
が1
の特定のレコードを参照していることが明らかになります。このようにURIがリソースを一意に識別することを可能にしています。
また、リソースは「情報の集合」として表現されます。そのため、リソースを識別するURIは「名詞の複数形」を使います。例えば、従業員の情報全体を示すURIは/getEmployee
ではなく、/employees
となります。
RailsでのRESTはリソース指向アーキテクチャをベースにしているんだ。これは、データベースのテーブルや情報の集まりを「リソース」として捉え、それぞれに一意なURIを割り当てて識別する方法だよ。
RESTの概念
REST(Representational State Transfer)はリソース指向アーキテクチャをベースとしており、リソースに対する操作方法(読み取り、作成、更新、削除など)を定めています。これらの操作は、HTTPメソッド(GET、POST、PUT、DELETE)を利用して行います。
以下は、RESTにおけるCRUD操作と対応するHTTPメソッドの一覧です。
CRUD操作 | HTTPメソッド | 説明 |
---|---|---|
Create (作成) | POST | リソースに新しいデータを追加する |
Read(読み取り) | GET | リソースからデータを取得する |
Update(更新) | PUT / PATCH | 既存のリソースを更新する |
Delete(削除) | DELETE | リソースを削除する |
重要な点は、URIがリソースを一意に識別し、HTTPメソッドがリソースに対して行う「操作」を指定することです。クライアント側は、これらのHTTPメソッドを使用してリソースにアクセスし、操作を行います。
例えば、/employees
というURIはemployees
テーブルに関連するリソースを表し、CRUD操作は対応するHTTPメソッド(GETで読み取り、POSTで作成、PUTで更新、DELETEで削除)によって行われます。
GETメソッドを使用する例では、以下のように/employees
のURIでemployees
リソースを指定し、HTTPメソッドのGET
を使用してemployees
テーブルから全てのレコードを取得します。
POSTメソッドを使用する例では、以下のようにPOST /employees
というリクエストによりemployees
テーブルに新しいレコードを作成します。
このように、HTTPメソッドを使用してリソースに対する具体的な操作を指定することができます。employees
リソースに対する他の操作例は、次の通りです。
Webブラウザからのリクエストは、ルーティングを経由します。そのリクエストに応じて、コントローラを司令塔とするMVCでリソースの処理が行われます。
データベースのリソースは、以下のようにモデルの「ActiveRecord」を介してオブジェクトとして扱われ、アプリケーション内でのデータ操作が可能になります。
Railsでは、各リソースの処理はモデル-ビュー-コントローラ(MVC)アーキテクチャに従って設計されています。具体的には、特定のURIに対するリクエストが発生すると、Railsはそれに関連するMVCコンポーネントを動作させます。
/employees
というURIへのリクエストがある場合、次の箇所で処理が行われます。
Railsでは、REST原則に従ってWebアプリケーションを設計し、開発することが推奨されています。これにより、Web上の情報や機能を整理し、使いやすくすることができます。
設計ってそんな大事なの?
設計に従わないと、めちゃくちゃなコードになってしまう恐れがあるんだ。初学者のうちはこの設計に沿ってコードを書いていくようにしよう。
3.RESTfulルーティングとCRUD操作
前セクションでは、REST原則について学びました。これは、データベースのテーブルなど、共通の特徴を持つ情報の集まりを「リソース」として捉え、それぞれのリソースを一意のURIとHTTPメソッドを用いて特定し操作するという方法です。このようなREST原則に基づく設計を「RESTful」と呼びます。
このセクションでは、Ruby on Railsを使用して、このRESTfulなアプローチに沿ったルーティング(RESTfulルーティング)とCRUD操作の具体的な実装方法を学んでいきます。
ルーティング設計
以前、ルーティングの設定はconfig/routes.rb
ファイルで行うことを学びましたね。このファイルは、Railsアプリケーションでの各リクエストがどのコントローラとアクションにルーティングされるかを定義する場所です。
1
2
3
Rails.application.routes.draw do
HTTPリクエストメソッド 'パス', to: 'コントローラ名#アクション名'
end
1
2
3
Rails.application.routes.draw do
get 'articles', to: 'articles#index'
end
Railsではルーティングを設定する際の原則として、RESTfulなアプローチ(RESTfulルーティング)に沿った設計が基本とされています。RESTfulルーティングでは、Webアプリケーション内の各リソースに対して、適切なHTTPメソッドと一貫性のあるURLパターンを使用します。
以下の表は、RESTfulルーティングにおける一連の標準的な操作とそのURLパターンです。
リソースに対する操作と目的 | HTTPメソッドとURLパターン |
---|---|
Index: リソースの一覧を表示 | GET /{リソース名} |
Show: 特定のリソースの詳細を表示 | GET /{リソース名}/:id |
New: 新しいリソースを作成するためのフォームを表示 | GET /{リソース名}/new |
Create: 新しいリソースの作成 | POST /{リソース名} |
Edit: 既存のリソースを編集するためのフォームを表示 | GET /{リソース名}/:id/edit |
Update: 既存リソースの更新 | PATCH /{リソース名}/:id |
Destroy: 特定のリソースの削除 | DELETE /{リソース名}/:id |
これらのRESTfulルーティングの標準パターンを特定のリソースに適用する場合、config/routes.rb
ファイルで以下のように設定します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Rails.application.routes.draw do
# Index: リソースの一覧を表示
get '{リソース名}', to: '{リソース名}#index'
# New: 新しいリソースを作成するためのフォームを表示
get '{リソース名}/new', to: '{リソース名}#new'
# Create: 新しいリソースを作成
post '{リソース名}', to: '{リソース名}#create'
# Show: 特定のリソースの詳細を表示
get '{リソース名}/:id', to: '{リソース名}#show'
# Edit: 既存のリソースを編集するためのフォームを表示
get '{リソース名}/:id/edit', to: '{リソース名}#edit'
# Update: 既存のリソースを更新
patch '{リソース名}/:id', to: '{リソース名}#update'
# Destroy: 特定のリソースを削除
delete '{リソース名}/:id', to: '{リソース名}#destroy'
end
ここで使われる{リソース名}
は、実際のリソース名に置き換えるためのプレースホルダーです。このプレースホルダーを具体的なリソース名に変更することで、そのリソースに適用されるRESTfulルーティングのルールが定義されます。
例えば「articles」というリソースに対するルーティング設定は、以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Rails.application.routes.draw do
# Index: 記事の一覧を表示
get 'articles', to: 'articles#index'
# New: 新しい記事を作成するためのフォームを表示
get 'articles/new', to: 'articles#new'
# Create: 新しい記事を作成
post 'articles', to: 'articles#create'
# Show: 特定の記事の詳細を表示
get 'articles/:id', to: 'articles#show'
# Edit: 既存の記事を編集するためのフォームを表示
get 'articles/:id/edit', to: 'articles#edit'
# Update: 既存の記事を更新
patch 'articles/:id', to: 'articles#update'
# Destroy: 特定の記事を削除
delete 'articles/:id', to: 'articles#destroy'
end
RESTfulルーティングでは、特定のリソースを操作するためのHTTPメソッドとURLパターンが定まっており、これは他のリソースにも同様に適用されます。
たとえば、先程のarticles
リソースの例に代わり、employees
という異なるリソースが存在する場合でも、同じルーティングパターンが適用されます。ここでの違いは、リソース名の部分がarticles
からemployees
に変わるだけです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Rails.application.routes.draw do
# Index: 社員の一覧を表示
get 'employees', to: 'employees#index'
# New: 新しい社員を追加するためのフォームを表示
get 'employees/new', to: 'employees#new'
# Create: 新しい社員を追加
post 'employees', to: 'employees#create'
# Show: 特定の社員の詳細を表示
get 'employees/:id', to: 'employees#show'
# Edit: 既存の社員を編集するためのフォームを表示
get 'employees/:id/edit', to: 'employees#edit'
# Update: 既存の社員の情報を更新
patch 'employees/:id', to: 'employees#update'
# Destroy: 特定の社員を削除
delete 'employees/:id', to: 'employees#destroy'
end
先程のGET /articles
はarticles
リソースの一覧を表示するためのルートでしたが、GET /employees
はemployees
という別のリソースの一覧を表示するためのルートになります。
このようにRESTfulルーティングでは、リソースの種類に関わらず同じパターンのURL構造が用いられます。この一貫性は、各リソースへのアクセスや操作方法を明確にし、開発者やユーザーが各リソースに対する適切なアクセス方法を簡単に理解し、把握するのを助けます。
RESTfulルーティングの大きなメリットは、URLパターンの一貫性と直感的な構造であり、どのリソースに対する操作がどのHTTPメソッドとURLパターンに対応しているかを簡単に理解できます。
resourcesメソッド
Railsが提供するresources
メソッドを使用すると、RESTfulルーティングに必要な標準的なルートが自動的に生成され、ルーティングの設定が簡素化されます。
1
2
3
Rails.application.routes.draw do
resources :リソース名
end
例えば、employees
リソースに対するルーティングを設定する場合、以下のように定義します。
1
2
3
Rails.application.routes.draw do
resources :employees
end
このresources :employees
の記述は、以下に示される各種ルート定義とほぼ同様です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Rails.application.routes.draw do
# Index: 社員の一覧を表示
get 'employees', to: 'employees#index'
# New: 新しい社員を追加するためのフォームを表示
get 'employees/new', to: 'employees#new'
# Create: 新しい社員を追加
post 'employees', to: 'employees#create'
# Show: 特定の社員の詳細を表示
get 'employees/:id', to: 'employees#show'
# Edit: 既存の社員を編集するためのフォームを表示
get 'employees/:id/edit', to: 'employees#edit'
# Update: 既存の社員の情報を更新
patch 'employees/:id', to: 'employees#update'
# Destroy: 特定の社員を削除
delete 'employees/:id', to: 'employees#destroy'
end
このようにresources
メソッドを使うことで、ルーティングの設定が大幅に簡単になり、コードの重複を避けることができます。この章では、RESTfulルーティングの学習のためにあえてresourcesメソッドは使用しません。
config/routes.rb
ファイルを開き、employees
リソースに対して、resources
メソッドを使用せずにRESTfulルーティングを設定してみましょう。コメントアウトの記述は任意です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Rails.application.routes.draw do
# Index: 社員の一覧を表示
get 'employees', to: 'employees#index'
# New: 新しい社員を追加するためのフォームを表示
get 'employees/new', to: 'employees#new'
# Create: 新しい社員を追加
post 'employees', to: 'employees#create'
# Show: 特定の社員の詳細を表示
get 'employees/:id', to: 'employees#show'
# Edit: 既存の社員を編集するためのフォームを表示
get 'employees/:id/edit', to: 'employees#edit'
# Update: 既存の社員の情報を更新
patch 'employees/:id', to: 'employees#update'
# Destroy: 特定の社員を削除
delete 'employees/:id', to: 'employees#destroy'
end
現段階では、RESTfulルーティングの学習のためにresourcesメソッドは使用しません。
7つの標準的な操作
RESTfulルーティングを使用する際、通常は1つのリソースに対して7つの標準的な操作が設定されます。これらの操作は以下の通りです。
- Index:リソースの一覧を表示します。
- Show:特定のリソースの詳細を表示します。
- New:新しいリソースを作成するためのフォームを表示します。
- Create:新しいリソースを作成します。
- Edit:既存のリソースを編集するためのフォームを表示します。
- Update:既存のリソースを更新します。
- Destroy:特定のリソースを削除します。
上記の各操作(Index、Show、New、Create、Edit、Update、Destroy)は、RESTfulルーティングの設定に従って、以下のようにコントローラ内の対応する同名のアクション(index、show、new、create、edit、update、destroy)に割り当てられます。
コントローラのアクションは、リクエストを処理するメソッドです。RESTfulルーティングでは、リソースごとに異なるコントローラが使用されますが、各コントローラ内で7つの標準的な操作を実装するアクションの名前と目的は一貫しています。
操作 | コントローラ#アクション名 | 目的 |
---|---|---|
Index | {リソース名}#index | リソースの一覧を表示する |
Show | {リソース名}#show | 特定のリソースの詳細を表示する |
New | {リソース名}#new | 新しいリソースを作成するためのフォームを表示する |
Create | {リソース名}#create | 新しいリソースを作成する |
Edit | {リソース名}#edit | 既存のリソースを編集するためのフォームを表示する |
Update | {リソース名}#update | 既存のリソースを更新する |
Destroy | {リソース名}#destroy | 特定のリソースを削除する |
例えば、employees
リソースについて考えてみましょう。
リソースは「処理の対象となる共通点を持つ情報の集まり」であり、通常、データベースのテーブルに相当します。ここでは、employees
リソースがemployees
テーブル(社員情報の集まり)を指しています。
employees
リソースに対するリクエストをRESTfulルーティングで設定する場合、以下のコードのようになります。
1
2
3
4
5
6
7
8
9
10
11
12
Rails.application.routes.draw do
get 'employees', to: 'employees#index'
get 'employees/new', to: 'employees#new'
post 'employees', to: 'employees#create'
get 'employees/:id', to: 'employees#show'
get 'employees/:id/edit', to: 'employees#edit'
patch 'employees/:id', to: 'employees#update'
delete 'employees/:id', to: 'employees#destroy'
# または以下のように簡潔に設定
resources :employees
end
この設定により、employees
リソースに関連する7つの標準的な操作が一つのコントローラ(employeesコントローラ)内の対応するアクションに割り当てられます。
以下の表では、先程の表と比べてコントローラの名称やリソース部分は異なりますが、コントローラ内で実装される7つの標準的な操作のアクション名と目的は同じですね。
操作 | コントローラ#アクション名 | 目的 |
---|---|---|
Index | employees#index | 社員の一覧を表示 |
Show | employees#show | 特定の社員の詳細情報を表示 |
New | employees#new | 新しい社員の追加用フォームを表示 |
Create | employees#create | 新しい社員を登録 |
Edit | employees#edit | 既存の社員情報の編集用フォームを表示 |
Update | employees#update | 既存の社員情報を更新 |
Destroy | employees#destroy | 特定の社員を削除 |
employees
コントローラでは、employees
リソースに対するリクエストを処理するメソッド(アクション)を以下のように定義します。employees_controller.rb
ファイルを開き、アクションを定義してみましょう。コメントアウトの記述は任意です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class EmployeesController < ApplicationController
def index
# 社員の一覧を取得する処理
end
def show
# 特定の社員の詳細情報を取得する処理
end
def new
# 新しい社員の登録フォームを表示する処理
end
def create
# 新しい社員を登録する処理
end
def edit
# 既存の社員情報を編集するためのフォームを表示する処理
end
def update
# 既存の社員情報を更新する処理
end
def destroy
# 特定の社員を削除する処理
end
end
モデルとコントローラの連携
Railsのモデルとコントローラは密接に連携して動作します。コントローラのアクションには、モデルを通じてデータベースとのやり取りを実装します。
モデルはデータベースのテーブルに対応しており、ActiveRecordを使用してデータベース操作を効率的かつ簡潔に行うことが可能です。
コントローラのアクションでは、これらのモデルを利用して具体的なデータ操作などを実装します。
たとえば、employees
コントローラのindexアクションでは、Employee
モデルにall
メソッドを使用して社員の一覧を取得し、@employees
インスタンス変数に代入してビューに渡すことができます。
1
2
3
4
5
6
class EmployeesController < ApplicationController
def index
# 社員の一覧を取得する処理
@employees = Employee.all
end
end
「ActiveRecordによるCRUD操作の基礎」で学んだように、all
メソッドはモデルに対応するテーブルのすべてのレコードを取得するメソッドです。上記の例では、Employee
モデルに対応するemployees
テーブルの全レコードを取得し、それを@employees
に代入しています。
また、コントローラのアクション内で設定したインスタンス変数は、ビューファイル内で直接利用できることも学びました。したがって、employees
テーブルのすべてのレコードの情報が格納された @employees
は、該当するアクションに対応するビューファイルで使用することが可能です。
この前は、コンソール上でActiveRecordのメソッドを使ってデータ操作を学んだけど、実際にはコントローラのアクションに定義して、インスタンス変数にセットすることでビューにデータを渡せるんだね!
このようなアクションの実装(モデルとの連携)は、次の章から手を動かしながら学習するよ!その前に、CRUD処理の実装手順を確認しておこう。
4.CRUD処理を実装する基本手順
RailsでRESTfulなCRUDアプリケーションを作成する際の基本手順を確認しましょう。実際のコーディングは次の章から始めますが、先に大まかな流れを理解しておきます。
CRUD処理の実装における基本的なステップは、以下の通りです。
- モデルの作成:データ操作の基本単位となるモデルを作成します。
- データベースのマイグレーション:rails db:migrateコマンドを実行して、モデルに対応するデータベースのテーブルを作成します。
- ルーティングの設定:config/routes.rbファイルで、CRUD操作に必要なルート(URLパターンとそれに対応するコントローラのアクション)を設定します。
- コントローラの作成と設定:コントローラ内にCRUDに対応するアクション(メソッド)を定義します。
- ビューの作成:各アクションに対応するビューを作成します。
- アクションの実装(モデルとの連携):コントローラのアクション内で、モデル(ActiveRecord)を介してデータベースとのやり取りを実装します。
各CRUD操作の実装には、特に手順3から手順6までのステップを繰り返します。この章では、学習目的のため、先にルーティングの設定(手順3)とコントローラの作成と設定(手順4)は設定済みです。
次の章からは、手順3と手順4を振り返った後に、ビューの作成(手順5)に進みます。
さいごに
ここでは、Webブラウザを介してデータを操作するための基礎知識と、Railsでのデータ操作の設計方法について学びました。実際のコーディングに進む前に、これらの概念と手順をしっかりと理解することが重要です。次のセクションでは、これらの基本に基づき、実際にコードを書いて、具体的なデータ操作を行っていきます。この学習を通じて、Railsを使ったWebアプリケーションの基本をしっかりと身につけましょう。
この章をもう一度学習したい方のみ、以下のようにファイルのコードを変更前に戻してから取り組んでみてください。
config/routes.rb
ファイルを開き、変更前の状態に戻しましょう。
1
2
3
Rails.application.routes.draw do
get '/employees', to: 'employees#index'
end
1
2
3
4
5
class EmployeesController < ApplicationController
def index
@text = 'indexアクションが実行されました'
end
end
この記事のまとめ
- Railsにおけるリソースは、「処理の対象となる共通点を持つ情報の集まり」を指し、通常はデータベースの「テーブル」をリソースとして捉える
- 各リソースに一意なURIを割り当てることで、そのリソースを識別する
- URIは、リソースの「名前」と「アドレス(住所)」の両方を表す
この記事で学んだことをTwitterに投稿して、アウトプットしよう!
Twitterの投稿画面に遷移します