Ruby on RailsのCRUD操作の基礎を学びましょう。
CRUDとは?
CRUD(クラッド)とはアプリケーションにおけるデータ操作の基本となる
4つの機能のことです。
CRUDは以下の4つの操作を指します。
操作 | 説明 |
---|---|
Create | 新しいデータを作成する |
Read | 既存のデータを読み取る |
Update | 既存のデータを更新する |
Delete | 既存のデータを削除する |
これら4つの操作の単語の頭文字を取ってCRUDと呼びます。
Scaffoldを使ったCRUDの実装
Ruby on Railsでは、scaffold
というコマンドを使って
CRUD操作を簡単に実装することができます。
scaffold
は、モデル、コントローラー、ビューを自動生成して、
CRUD操作を実装するための基本的なコードを生成します。
では、Railsのscaffold
で簡単なタスク管理アプリケーションを作成してみましょう。
今回はタイトル、説明、完了状態を持つタスクを管理するアプリケーションを作成します。
ジェネレータコマンドは rails generate scaffold
を使用します。
書式は次の通りです。
$ rails generate scaffold モデル名 カラム名:型 カラム名:型 ...
今回のタスク管理アプリケーションでは、Task
というモデルを作成し、
title
(文字列)、description
(テキスト)、completed
(真偽値)の3つのカラムを持つ
Task
モデルを作成します。
ターミナルで次のコマンドを実行します。
$ rails generate scaffold Task title:string description:text completed:boolean
これにより、以下のファイルが生成されます。
- モデル:
app/models/task.rb
- マイグレーション:
db/migrate/xxxxxx_create_tasks.rb
xxxxxx
はタイムスタンプで、実行時に自動的に生成されます。
- コントローラー:
app/controllers/tasks_controller.rb
- ビュー:
app/views/tasks/
- ルーティング:
config/routes.rb
マイグレーションの実行
マイグレーションとは、移行や変更を意味し、データベースのスキーマを変更するための仕組みです。
マイグレーションを実行することで、今回はデータベースにtasks
テーブルが作成されます。
ではサーバーを起動して http://localhost:3000 にアクセスしてみましょう。
$ rails server
次のようなエラーが表示されます。
Ruby on Railsの開発環境では未実行のマイグレーションファイルがある場合、
ActiveRecord::PendingMigrationError
というエラーが発生します。
画面上のRun Pending migrations
をクリックすることでもマイグレーションを実行できますが、
これは開発環境向けの方法なので、本番環境でも利用できる方法でマイグレーションを実行してみましょう。
その前に実行されるマイグレーションの内容を確認してみましょう。
マイグレーションファイルはdb/migrate/xxxxxx_create_tasks.rb
です。
xxxxxx
の部分はタイムスタンプで、migrationファイルを生成した時刻が入ります。
class CreateTasks < ActiveRecord::Migration[8.0] def change create_table :tasks do |t| t.string :title t.text :description t.boolean :completed
t.timestamps end endend
このマイグレーションファイルは、tasks
テーブルを作成し、
次のようなカラムを持つことを定義しています。
カラム名 | 型 |
---|---|
title | string |
description | text |
completed | boolean |
データベースの操作にはSQL
という言語が使われますが、
ここではSQLが一切書かれておらず、Rubyのコードのみです。
これはRuby on RailsのActive RecordというORM(Object-Relational Mapping)ライブラリが
RubyのコードをSQLに変換して実行してくれるためです。
このようにRuby on Railsのマイグレーション機能を用いると、データベースのスキーマの変更を
生SQLを書かずにRubyのコードで記述できます。
このように特定のタスク(今回の場合はマイグレーション)に特化した言語をドメイン固有言語(DSL)と呼びます。
Ruby on Railsでは、マイグレーションのDSLを使ってデータベースのスキーマを定義します。
では、マイグレーションを実行してみましょう。
ターミナルで次のコマンドを実行します。
$ rails db:migrate
これでtasks
テーブルがデータベースに作成されました。
データベースを確認してみる
データベースにtasks
テーブルが作成されたことを確認してみましょう。
Railsでは、デフォルトでSQLiteという軽量なデータベースを使用しています。
SQLiteはファイルベースのデータベースで、特別な設定なしに
データベースを作成できます。
SQLiteのデータベースファイルは、db/development.sqlite3
にあります。
SQLiteのデータベースを確認するために、SQLiteのコマンドラインツールを使用します。
ターミナルで次のコマンドを実行します。
$ sqlite3 db/development.sqlite3
正常にコマンドラインツールを起動できると、ターミナルのプロンプトがsqlite>
に変わります。
次のコマンドでコマンドラインツールを終了します。
.quit
Ruby on Railsでは次のコマンドでもSQLiteのデータベースを確認できます。
$ rails dbconsole
こちらの方法の方が、Railsの環境に合わせたデータベースのコンソールを起動できるので便利です。
SQLite以外のデータベースを使用している場合でも、同様にデータベースのコンソールを起動できます。
では上記のいづれかの方法でデータベースのコンソールを起動して、
次のコマンドを実行してtasks
テーブルが存在することを確認してみましょう。
.tables
次のようにtasks
テーブルが表示されるはずです。
ar_internal_metadata schema_migrationstasks
ar_internal_metadataとschema_migrations
ar_internal_metadata
とschema_migrations
は、Railsが内部で使用するメタデータを格納するためのテーブルです。
これらのテーブルは、Railsのマイグレーションやデータベースの状態を管理するために使用されます。
主に実行済のマイグレーションファイルの情報を保持し、同じマイグレーションを再実行しないようにするために使用されます。
これらのテーブルは、Railsの内部で使用されるため、通常は直接操作する必要はありません。
Railsが内部で使用しているテーブルなので、誤って削除したり変更したりしないように注意しましょう。
db/schema.rbの確認
rails db:migrate
を実行すると、db/schema.rb
というファイルが自動的に生成、更新されます。
db/schema.rb
は、データベースのスキーマをRubyのコードで表現したものです。
ActiveRecord::Schema[8.0].define(version: 2025_06_30_011523) do create_table "tasks", force: :cascade do |t| t.string "title" t.text "description" t.boolean "completed" t.datetime "created_at", null: false t.datetime "updated_at", null: false endend
ファイルの先頭に書いてある通り、
このファイルは自動生成されるため、手動で変更しないようにしましょう。
開発を進めていくと、migrationファイルが増えていきます。
rails db:migrate
はマイグレーションファイルをひとつづつ実行していくため、
データベースを初回にセットアップしたい場合は時間がかかってしまいます。
そこで最新のスキーマをdb/schema.rb
に書き出しておき、
db/schema.rb
をもとにマイグレーションを実行する、
rails db:schema:load
というコマンドが存在します。
rails db:migrate
ですべてのマイグレーションを最初から実行するより、
高速かつエラーが発生しにくい方法です。
tasksテーブルのカラムを確認する
次に、tasks
テーブルのカラムを確認してみましょう。
データベースのコンソールで次のコマンドを実行します。
.schema tasks
次のようにtasks
テーブルのカラムが表示されます。
CREATE TABLE IF NOT EXISTS "tasks" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar, "description" text, "completed" boolean, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);
マイグレーションファイルに定義したとおり、title
、description
、completed
の3つのカラムが存在します。
また、created_at
とupdated_at
の2つのカラムも自動的に追加されています。
これらのカラムは、レコードの作成日時と更新日時を自動的に管理するためのものです。
Railsでは、これらのカラムを自動的に追加するために、t.timestamps
をマイグレーションファイルに記述します。
これにより、レコードの作成日時と更新日時が自動的に管理されます。
CRUD操作を試してみる
データベースにtasks
テーブルが作成されたことが確認できたので、次はCRUD操作を試してみましょう。
サーバーを起動して、ブラウザでhttp://localhost:3000/tasks
にアクセスします。
New Task
というリンクが表示されているので、クリックして新しいタスクを作成してみましょう。
クリックすると http://localhost:3000/tasks/new に移動します。
ここでタスクのタイトル、説明、完了状態を入力してCreate Task
ボタンをクリックします。
タスクが正常に作成されると、次のような画面が表示されます。
URLは http://localhost:3000/tasks/1 となっており、1
は作成されたタスクのIDです。
タスクの詳細画面からは、タスクの情報を確認したり、編集、削除、一覧画面へ戻ることができます。
ではEdit this task
リンクをクリックして、タスクの編集画面に移動してみましょう。
URLは http://localhost:3000/tasks/1/edit となります。
適当にタイトルや説明を変更して、Update Task
ボタンをクリックします。
このようにタスクを作成、表示、編集、削除できるのがCRUD操作です。
タイトルと説明を必須にする
タスクの一覧画面 http://localhost:3000/tasks にもどり、
New Task
リンクをクリックして新しいタスクを作成してみましょう。
あえて、何も入力せずにCreate Task
ボタンをクリックしてみます。
そうするとタイトルがない、説明もないタスクが作成されてしまいます。
タイトルと説明が存在しないタスクは作成したくないので、
タイトルと説明を必須にするバリデーション(検証)を追加してみましょう。
app/models/task.rb
を開いて、次のようにバリデーションを追加します。
class Task < ApplicationRecord validates :title, presence: true validates :description, presence: trueend
presence: true
は、指定したカラムが空でないことを検証するバリデーションです。
これにより、タイトルと説明が空の場合はタスクを作成できなくなります。
では、再度タスクを作成してみましょう。
タイトルと説明を空にしてCreate Task
ボタンをクリックすると、
次のようなエラーメッセージが表示されます。
これで、タイトルと説明が必須であることが検証され、空の場合はタスクを作成できなくなりました。
CRUD操作の全体像
CRUD操作の全体像を確認してみましょう。
各操作がつながっていることがわかります。
今回はscaffoldを使ってCRUD操作を実装しましたが、
次のレクチャーでは、このCRUD操作を一から実装していきます。