今回はRuby on Railsの便利なコマンド、scaffoldを使ってToDoアプリを作成してみます。
驚くほどあっという間に簡単なアプリケーションをつくれてしまうRailsの素晴らしさを体験してみましょう。

本来、scaffoldはRailsにある程度慣れるまでは乱用しないほうが良いコマンドですが、今回はRailsの全容を把握するための手引きとして活用してみます。

オンラインでプログラミング学習を始めてみたいなら、米国シリコンバレー発祥の世界最大級のオンライン学習プラットフォーム、Udemyがおすすめです。
こちらの記事で紹介するフレームワーク、Ruby on Railsも学ぶことができます!
よくわかるRuby on Rails入門 オンライン講座

プロジェクトの準備

まずは、Railsのプロジェクトを新たに作成しましょう。
任意のディレクトリ内で以下のコマンドを実行してください。

$ rails new todo-app
      create
      create  README.md
      create  Rakefile

...

├─ websocket-extensions@0.1.4
└─ ws@6.2.2
Done in 9.65s.
Webpacker successfully installed 🎉 🍰

インストールが完了するまで少し時間がかかります。
作成が完了したら、Railsの開発用アプリケーションサーバを起動し、ウェルカムページにアクセスしてみましょう。
プロジェクトディレクトリ内に移動し、以下のコマンドを実行してください。

$ cd todo-app
$ rails server

=> Booting Puma
=> Rails 6.1.4.1 application starting in development

...

* Listening on http://[::1]:3000
* Listening on http://127.0.0.1:3000
Use Ctrl-C to stop

http://127.0.0.1:3000にアクセスしてRailsの初期画面が表示されれば準備完了です。
ちなみに、serverコマンドのショートカットとしてsコマンドがあり、どちらも同じ動作となります。
またserverコマンドを停止したい場合は、Ctrl + C を押せば大丈夫です。

現場を意識した本格的な学習カリキュラムで、本物のスキルを身につけたいならこちら!
困ったときにいつでも相談できるバディ制度でわからないこともすぐに解決できます。
プログラミングスクールといえば【RUNTEQ】

generateコマンドの使い方

railsコマンドの中でも最もよく使うコマンドのひとつにgenerateコマンドがあります。
こちらのコマンドは開発に必要となるファイルを、テンプレートを元にまとめて生成することができます。
ショートカットはgコマンドです。

以下のようにして実行すると、userというデータに対して定義された様々なファイルやディレクトリが生成されたり必要な記述が追加されたりします。

$ rails generate scaffold user

少し読み解いていくと、generateコマンドには何を生成したいのかという対象と、その対象の名前を続けて指定します。
ここでは対象としてscaffoldという一括生成のコマンドを使用しています。
また対象の名前をuserとすることによって、自動的にデータベースにusersテーブルが作られ、それに対応したUserモデルやコントローラも用意されます。

generateコマンドの種類

generateコマンドの対象として指定できるものにはscaffold以外にもいくつかの種類があります。

コマンド概要
scaffold基本的なCRUD機能(※後述)を備えたすべての関連ファイルを生成する
scaffold_controller基本的なCRUD機能を備えたコントローラとビューを生成する
controllerシンプルなコントローラとビューを生成する
modelシンプルなモデルとマイグレーションファイルを生成する
migrationシンプルなマイグレーションファイルを生成する

それぞれのコマンドで生成されるディレクトリやファイルの種類が変わってきます。
また、コマンドを使わずに手動で作成しても全く問題はありません(ただし記述ミスに注意しましょう)。

ちなみにscaffoldは「足場」という意味です。
まさにアプリケーションの足場となるような基本機能を簡単にそろえることができます。

間違えてgenerateコマンドを実行してしまい生成されたファイルをすべて綺麗に消すには、destroyコマンドを実行します。

$ rails destroy scaffold user

CRUDとは

CRUDとは、基本的なデータベースに対する4つの操作の頭文字をとった概念です。
データベースに登録されるデータ(レコード)の扱いは、この4つの操作ですべて表現できます。

Createレコードの登録
Readレコードの取得・参照
Updateレコードの更新
Deleteレコードの削除

Readのみデータに対して影響を与えない、参照系の操作になります。
それ以外の3つは更新系の操作となり、データに対して影響を与えますので注意して使いましょう。

ToDoアプリの実装

ToDoアプリとは、やること(タスク)をリスト化して管理できるアプリです。

タスクを新規作成する(Create)、タスクを一覧表示したり各タスクの詳細を表示する(Read)、タスクの内容を変更する(Update)、タスクを削除する(Delete)の機能が必要となります。

このようなアプリをRailsで作成するのに難しいプログラムの実装は全く必要ありません。
なんと先ほどのscaffoldコマンドを打ち込むだけで簡単に完成してしまいます。

scaffoldコマンドの実行

それではさっそくgenerateコマンドで簡単なToDoアプリを作成してみましょう。
以下のコマンドを実行してみてください。

$ rails generate scaffold task body:text

body:textは、作成するtasksテーブル(データベース)のカラムの名前と型の指定で、これによりテーブル定義に関する記述がプログラムに追加されます。

コマンドを実行すると、config/routes.rbファイルに次のような記述が追加されます。
不要なコメントについては削除してあります。

Rails.application.routes.draw do
  resources :tasks   # generateコマンドによって追加された行
end

config/routes.rbファイルにはアプリケーションのルーティング情報を記述します。
基本的には下記のように、最初にURLのパスを指定してその後ろに対応するコントローラ名とアクション名(コントローラ内のメソッド)を記述します。
開発環境でhttp://127.0.0.1:3000/tasksにアクセスしたとき、tasksコントローラ(app/controllers/tasks_controller.rb)のindexメソッド(アクション)を呼び出すことを意味しています。

Rails.application.routes.draw do
  get '/tasks' => 'tasks#index'
end

では、resourcesとは何者なのでしょうか?
Railsで定義されているルーティングの一覧を確認するために、routesコマンドを使用してみます。

$ rails routes

     Prefix   Verb     URI Pattern                 Controller#Action
      tasks   GET      /tasks(.:format)            tasks#index
              POST     /tasks(.:format)            tasks#create
   new_task   GET      /tasks/new(.:format)        tasks#new
  edit_task   GET      /tasks/:id/edit(.:format)   tasks#edit
       task   GET      /tasks/:id(.:format)        tasks#show
              PATCH    /tasks/:id(.:format)        tasks#update
              PUT      /tasks/:id(.:format)        tasks#update
              DELETE   /tasks/:id(.:format)        tasks#destroy
...

なにやらたくさんのルーティングが定義されています。
実はresourcesを使うと、基本的なCRUD機能に必要となるルーティングをまとめて定義してくれるのです。

慣れれば非常に便利なのですが、はじめはルーティングをひとつずつ定義していく方がおすすめです。
処理の流れを把握しやすいようにするためにも、generate scaffoldやresourcesは最初のうちは乱用しないようにするのが良いでしょう。

マイグレーションの実行

scaffoldのジェネレートを行った際に、db/migrateディレクトリの中にコマンド実行時の日時から始まるファイル(xxxx_create_tasks.rb)ができています。
これはマイグレーションファイルといい、データベースのテーブル定義を行います。
以下は生成されたファイルの中身で、tasksテーブルを作成する定義が書かれています。
コマンド実行時に指定したbodyカラムに関する定義が含まれていることを確認しておきましょう。

class CreateTasks < ActiveRecord::Migration[6.1]
  def change
    create_table :tasks do |t|
      t.text :body

      t.timestamps
    end
  end
end

マイグレーションファイルは作成しただけでは意味がなく、マイグレートを実行する(=データベースにテーブルの実体を登録する)必要があります。
実行されていないマイグレーションファイルが存在すると、アプリケーションがエラーを返します。
実際にサーバを立ち上げてhttp://127.0.0.1:3000/にアクセスしてみると、以下のようなエラー画面が表示されます。

それでは、データベースを準備してマイグレーションを実行してみましょう。
まずはdb:createコマンドでデータベースを作成します。
ここではsqliteを使用していますが、他のものを利用した場合でも同様の手順です。

$ rails db:create

Database 'db/development.sqlite3' already exists
Created database 'db/test.sqlite3'

データベースにアクセスするためにdbconsoleコマンドを実行してみましょう。

$ rails dbconsole

データベースにアクセスできたら、どのようなテーブルがあるのか確認してみましょう。
(以下はsqliteのコマンドになるので、他のデータベースでは使用できません)

SQLite version 3.35.2 xxxx
Enter ".help" for usage hints.

sqlite> .tables
ar_internal_metadata  schema_migrations

sqlite> .quit

既に2つのテーブル(ar_internal_metadataとschema_migrations)がありますが、これはRailsが自動で用意したものです。

ここまでできたら、scaffoldで作成されたマイグレーションファイルのマイグレートを実行してみましょう。
コマンドは、db:migrateです。

$ rails db:migrate

== xxxxxxxxxxxxxx CreateTasks: migrating ======================================
-- create_table(:tasks)
   -> 0.0052s
== xxxxxxxxxxxxxx CreateTasks: migrated (0.0053s) =============================

上記のように表示されていれば、正常にマイグレートが成功しています。
注意点として、一度マイグレートしたマイグレーションファイルは絶対に書き換えないようにしてください。
これは開発に慣れていないうちはやってしまいがちなミスなのですが、よく覚えておきましょう。
一度作ったテーブルの定義を変更したい場合は新しいマイグレーションファイルを作成するのが正しい対応です。

再度データベースにアクセスし、tasksテーブルができていることを確認してみます。

$ rails dbconsole

SQLite version 3.35.2 xxxx
Enter ".help" for usage hints.

sqlite> .tables
ar_internal_metadata  schema_migrations     tasks

sqlite> .schema tasks
CREATE TABLE IF NOT EXISTS "tasks" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "body" text, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);

sqlite> .quit

プログラミングでわからないことがあったら、その道のプロに質問するのが一番!
現役で活躍中のエンジニアと繋がって、効率的にWeb開発のスキルを身につけましょう。
プログラミング学習のスキルプラットフォーム【MENTA】

ToDoアプリの動作確認

ここまでできたらhttp://127.0.0.1:3000/tasksにアクセスしてみます。

ほとんど何も実装していないにも関わらず、ToDoアプリのトップ画面ができています。
New Taskを押すと以下の画面に遷移します。

Bodyに内容を入力して、Create Taskを押してみましょう。

タスクの作成が完了しました。
tasksのトップ画面に戻ってみると、先ほどの内容が登録されているのがわかります。

なんと本当にコマンド一発でToDoアプリが完成してしまいました!
実際に行った作業としては、scaffoldをジェネレートしてマイグレートを実行しただけです。
Railsのすさまじい機能が実感できましたね。

他にも編集機能や削除機能が自動で実装されていますので、確認してみてください。

まとめ

scaffoldコマンドを使ってToDoアプリを作ってみました。
驚くほど簡単に初めてのアプリを完成させることができてしまいました。

実行したコマンドをまとめます。

$ rails new todo-app
$ cd todo-app
$ rails generate scaffold task body:text
$ rails db:create
$ rails db:migrate

たったこれだけでアプリが完成してしまうのです。
今回はscaffoldコマンドしか使っていませんが、さらに具体的なRailsの実装スキルを学んでいくことで作成できるアプリケーションの幅が大きく広がります。
Railsの世界を楽しみながら、自分の頭に思い描いたアプリケーションを実装していけるように学習しましょう!

ひとりではなかなかプログラミングの学習が続かない、未経験だから不安が多い、という方はプログラミングスクールを利用してみるのも有効です。
本物のエンジニアに学ぶことで、時間がない方でも最短でスキルを身につけることができます。
現役エンジニアのパーソナルメンターからマンツーマンで学べる

お悩みの方は、まずは無料キャリアカウンセリングにお申込みください。

関連記事

この記事のタグ