目次
Scaffold(スキャフォールド)
Scaffoldとは、Railsに備わっている機能の一つで、Ruby on Railsでアプリケーションの雛形を作るための機能です。
Scaffoldとは、英語で「足場」という意味で、まさにRailsアプリの「足場」となる機能(一覧 / 登録 / 更新 / 削除するための一連の画面)を提供してくれます。
本記事では、超便利機能であるScaffoldを使い、CRUDを作成する方法を紹介しています。
※CRUDは次の頭文字を連結させた言葉です。
- C:Create(登録)
- R:Read(読み取り)
- R:Update(更新)
- D:Delete(削除)
スポンサーリンク
Railsアプリケーションの作成
本記事では、開発ツールに「Visual Studio Code」、データベースに「SQLite」を使用しています。Ruby on Railsの開発環境を構築していない方は、下記の記事をご覧ください。
Railsの開発環境はこちら
まず、次のコマンドよりRailsアプリケーションを作成します。
rails new アプリケーション名
今回の例では「C:\ruby」配下に「crud_sample」というアプリケーションを作成しています。
PS C:\ruby> rails new crud_sample
create
create README.md
create Rakefile
create .ruby-version
create config.ru
create .gitignore
create Gemfile
run git init from "."
Initialized empty Git repository in C:/ruby/crud_sample/.git/
・・・(省略)・・・
Done in 7.96s.
Webpacker successfully installed
ScaffoldでRailsアプリケーションの雛形を生成
次にでRailsアプリケーションの雛形を生成します。Scaffoldコマンドは次の形式で記述します。
rails g scaffold リソース名 カラム名1:データ型1 カラム名2:データ型2...
パラメータ | 説明 |
リソース名 | モデルクラスの名称 |
カラム名 | モデルクラスが持つカラム名 |
データ型 | カラムのデータ型 |
新規作成したRailsアプリケーション配下(crud_sample)に移動してscaffoldコマンドを実行します。今回の例では「user」というモデルを作成しています。
PS C:\ruby\crud_sample> rails g scaffold user name:string address:string phone:string
invoke active_record
create db/migrate/20200622220854_create_users.rb
create app/models/user.rb
invoke test_unit
create test/models/user_test.rb
create test/fixtures/users.yml
invoke resource_route
route resources :users
invoke scaffold_controller
create app/controllers/users_controller.rb
invoke erb
create app/views/users
create app/views/users/index.html.erb
create app/views/users/edit.html.erb
create app/views/users/show.html.erb
create app/views/users/new.html.erb
create app/views/users/_form.html.erb
invoke test_unit
create test/controllers/users_controller_test.rb
create test/system/users_test.rb
invoke helper
create app/helpers/users_helper.rb
invoke test_unit
invoke jbuilder
create app/views/users/index.json.jbuilder
create app/views/users/show.json.jbuilder
create app/views/users/_user.json.jbuilder
invoke assets
invoke scss
create app/assets/stylesheets/users.scss
invoke scss
create app/assets/stylesheets/scaffolds.scss
scaffoldコマンドを実行した結果、自動生成された主なファイルは次の通りです。
ファイル | 説明 |
config/routes.rb | ユーザーからのリクエストを、どのコントローラーのアクションに割り振るかを決めるルーティング情報 |
app/controllers/users_controller.rb | ユーザーからのリクエストを受け付けるコントローラー |
app/models/user.rb | データを格納するモデル |
app/views/users/index.html.erb | 一覧画面用のビュー |
app/views/users/show.html.erb | 詳細画面用のビュー |
app/views/users/new.html.erb | 登録画面用のビュー |
app/views/users/edit.html.erb | 編集画面用のビュー |
app/views/users/_form.html.erb | 共通フォーム用のビュー |
ルーティング情報
Rails.application.routes.draw do
resources :users
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
config/routes.rb に「resources :users」が追記されます。この記述により下記のルーティングが作成さされ、いずれも usersコントローラー に対応付けられます。
HTTPメソッド | パス | コントローラー#アクション | 説明 |
GET | /users | users#index | 一覧画面を表示 |
GET | /users/:id | users#show | 詳細画面を表示 |
GET | /users/new | users#new | 登録画面を表示 |
GET | /users/:id/edit | users#edit | 編集画面を表示 |
POST | /users | users#create | 登録処理 |
PATCH / PUT | /users/:id | users#update | 更新処理 |
DELETE | /users/:id | users#destroy | 削除処理 |
コントローラー(Controller)
app/controllers/users_controller.rbというコントローラークラスが新規に作成されます。
class UsersController < ApplicationController
before_action :set_user, only: [:show, :edit, :update, :destroy]
# GET /users
# GET /users.json
def index
@users = User.all
end
# GET /users/1
# GET /users/1.json
def show
end
# GET /users/new
def new
@user = User.new
end
# GET /users/1/edit
def edit
end
# POST /users
# POST /users.json
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html { redirect_to @user, notice: 'User was successfully created.' }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /users/1
# PATCH/PUT /users/1.json
def update
respond_to do |format|
if @user.update(user_params)
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { render :show, status: :ok, location: @user }
else
format.html { render :edit }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
# DELETE /users/1
# DELETE /users/1.json
def destroy
@user.destroy
respond_to do |format|
format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_user
@user = User.find(params[:id])
end
# Only allow a list of trusted parameters through.
def user_params
params.require(:user).permit(:name, :address, :phone)
end
end
スポンサーリンク
ビュー(View)
app/views/users配下に、一覧画面、詳細画面、登録画面、編集画面用のビューが新規で作成されます。
一覧画面(app/views/users/index.html.erb)
<p id="notice"><%= notice %></p>
<h1>Users</h1>
<table>
<thead>
<tr>
<th>Name</th>
<th>Address</th>
<th>Phone</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @users.each do |user| %>
<tr>
<td><%= user.name %></td>
<td><%= user.address %></td>
<td><%= user.phone %></td>
<td><%= link_to 'Show', user %></td>
<td><%= link_to 'Edit', edit_user_path(user) %></td>
<td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New User', new_user_path %>
詳細画面(app/views/users/show.html.erb)
<p id="notice"><%= notice %></p>
<p>
<strong>Name:</strong>
<%= @user.name %>
</p>
<p>
<strong>Address:</strong>
<%= @user.address %>
</p>
<p>
<strong>Phone:</strong>
<%= @user.phone %>
</p>
<%= link_to 'Edit', edit_user_path(@user) %> |
<%= link_to 'Back', users_path %>
登録画面(app/views/users/new.html.erb)
<h1>New User</h1>
<%= render 'form', user: @user %>
<%= link_to 'Back', users_path %>
編集画面(app/views/users/edit.html.erb)
<h1>Editing User</h1>
<%= render 'form', user: @user %>
<%= link_to 'Show', @user %> |
<%= link_to 'Back', users_path %>
マイグレーションでデータベースにテーブルを作成する
scaffoldコマンドでアプリケーションの雛形は完成しましたが、最後にデータベースのテーブルを作成する必要があります。
テーブルの作成にはマイグレーションファイルを使用します。
scaffoldで自動生成された「db/migrate/20200622220854_create_users.rb」です。※ファイル名の数値は実行した日時により異なります。
ポイント
マイグレーションとは、テーブルの作成や変更を簡単に管理する仕組み
マイグレーションコマンド「rails db:migrate」により、データベースにテーブルを作成します。
PS C:\ruby\crud_sample> rails db:migrate
== 20200622220854 CreateUsers: migrating ======================================
-- create_table(:users)
-> 0.0031s
== 20200622220854 CreateUsers: migrated (0.0090s) =============================
実行が正常に終了すると、データベースにテーブルが新規作成されます。
スポンサーリンク
それでは、実際にテーブルが作成されていることを確認してみます。「rails dbconsole」でデータベースに接続し「.tables」「.schema users」コマンドを使用することでテーブルが作成されていることを確認できます。
PS C:\ruby\crud_sample> rails dbconsole
SQLite version 3.32.2 2020-06-04 12:58:43
Enter ".help" for usage hints.
sqlite> .tables
ar_internal_metadata schema_migrations users
sqlite> .schema users
CREATE TABLE IF NOT EXISTS "users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "address" varchar, "phone" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);
動作確認
「rails s」コマンドを実行して、Railsのアプリケーションサーバを起動します。
PS C:\ruby\crud_sample> rails s
=> Booting Puma
=> Rails 6.0.3.2 application starting in development
=> Run `rails server --help` for more startup options
*** SIGUSR2 not implemented, signal based restart unavailable!
*** SIGUSR1 not implemented, signal based restart unavailable!
*** SIGHUP not implemented, signal based logs reopening unavailable!
Puma starting in single mode...
* Version 4.3.5 (ruby 2.7.1-p83), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://[::1]:3000
* Listening on tcp://127.0.0.1:3000
Use Ctrl-C to stop
ブラウザで「http://localhost:3000/users」にアクセスすると、一覧画面が表示されます。
「New User」リンクを押下すると登録画面が表示されるので、データを登録します。
一覧画面に戻ると、登録したデータが表示されます。
各リンクを押下することで各画面が表示されます。
- Show:詳細画面
- Edit:編集画面
- Destroy:データ削除
- New User:登録画面
終わりに
本記事では「超便利ScaffoldでCRUDを作成する方法」について紹介しました。
次回は、入力チェック(validates)の実装方法について紹介します。
- 準備編:Ruby on Railsの開発環境構築
- 入門編:Ruby on Railsで”Hello World”を作成する
- 基本編1:超便利ScaffoldでCRUDを作成する方法
- 基本編2:入力チェック(validates)の実装方法
- デザイン編1:RailsでBootstrapを導入する方法
- デザイン編2:RailsでAdminLTEを導入する方法
- 実践編1:Rails + AdminLTEで一覧画面を作成する
- 実践編2:Rails + AdminLTEで登録画面を作成する
- 実践編3:Rails + AdminLTEで編集画面を作成する
- 実践編4:Rails + AdminLTEで詳細画面を作成する