Railsでのenumの使い方を解説!設定方法やViewの修正方法まで
- システム
エンジニア - enumを利用することのメリットについて教えてください。
- プロジェクト
マネージャー - ではenumとは何か、基本の基礎から見ていきましょう。
Railsでのenumの使い方とは?
今回は、Ruby on Railsでのenumの使い方について説明します。
enumとは列挙型とも呼ばれ、複数の変数に連続した値を付けられるものです。連続でない任意の値を設定することもできます。
Ruby on Railsでのenumの使い方に興味のある方はぜひご覧ください。
Railsアプリの作成
まずはRuby on Railsのアプリを作成します。
以下のコマンドを実行します。
1
2
3
4
5
|
rails new myusers --database=mysql
cd myusers/
rails generate scaffold Myuser name:string age:integer birthplace:integer
rake db:create
rake db:migrate
|
MySQLにテーブルが作成されていることを確認します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
mysql> use myusers_development;
Database changed
mysql> desc myusers;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| birth_place | int(11) | YES | | NULL | |
| created_at | datetime(6) | NO | | NULL | |
| updated_at | datetime(6) | NO | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)
mysql>
|
次のコマンドでRailsアプリのサーバーを起動します。
1
|
rails server
|
Webブラウザから以下にアクセスしてください。空のリストが表示されることが分かります。
http://サーバアドレス:3000/myusers/
次に、ルーティングを設定します。
config/route.rbを以下のように修正します。
1
2
3
4
5
|
Rails.application.routes.draw do
resources :myusers
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
root to: redirect('/myusers/')
end
|
これで
http://サーバアドレス:3000/
でアプリにアクセスできるようになります。
画面から、以下のように適当にユーザーを登録しておきます。
1
2
3
4
5
|
Myusers
Name Age Birthplace
taro 0 0 Show Edit Destroy
jiro 1 1 Show Edit Destroy
saburo 2 2 Show Edit Destroy
|
enumの使用
それでは、Ruby on Railsのenumの使い方について紹介します。
まずはモデルファイルを修正します。
app/models/myuser.rbを以下のように修正してください。
1
2
3
4
|
class Myuser < ApplicationRecord
enum age:[:twenties, :thirties, :forties, :fifties, :sixties] # age
enum birthplace:[:tokyo, :ibaraki, :tochigi, :gunma, :kanagawa] # birth_place
end
|
ageおよびbirthplaceをenumにします。
Webブラウザを更新してみてください。以下のように表示されます。
1
2
3
4
5
|
Myusers
Name Age Birthplace
taro twenties tokyo Show Edit Destroy
jiro thirties ibaraki Show Edit Destroy
saburo forties tochigi Show Edit Destroy
|
0から連番でenumの番号が設定されていることが分かります。
viewの変更
Railsでenumに合わせて、viewを変更してみます。
ここでは、select boxにして設定した内容が選択された状態にします。
app/views/myusers/_form.html.erbを以下のように修正します。
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
30
31
32
|
<%= form_with(model: myuser, local: true) do |form| %>
<% if myuser.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(myuser.errors.count, "error") %> prohibited this myuser from being saved:</h2>
<ul>
<% myuser.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= form.label :name %>
<%= form.text_field :name %>
</div>
<div class="field">
<%= form.label :age %>
<%= form.select :age, Myuser.ages.keys.to_a, {} %>
</div>
<div class="field">
<%= form.label :birthplace %>
<%= form.select :birthplace, Myuser.birthplaces.keys.to_a, {} %>
</div>
<div class="actions">
<%= form.submit %>
</div>
<% end %>
|
select boxのコードは以下の部分です。
1
2
3
4
|
:
<%= form.select :age, Myuser.ages.keys.to_a, {} %>
:
<%= form.select :birthplace, Myuser.birthplaces.keys.to_a, {} %>
|
値を追加する場合
Railsでenumに値を追加する場合には注意が必要です。
例えば、ageにteensを追加したいとします。
select boxの先頭に追加するために、先頭に追加します。
1
2
3
4
|
class Myuser < ApplicationRecord
enum age:[:teens, :twenties, :thirties, :forties, :fifties, :sixties] # age
enum birthplace:[:tokyo, :ibaraki, :tochigi, :gunma, :kanagawa] # birthplace
end
|
Webブラウザを更新すると、以下のように表示されます。
1
2
3
4
5
|
Myusers
Name Age Birthplace
taro teens tokyo Show Edit Destroy
jiro twenties ibaraki Show Edit Destroy
saburo thirties tochigi Show Edit Destroy
|
enumはあくまでも数字ですので、ageがずれていることが分かります。
これでは都合が悪いですので、enumに値を指定します。
1
2
3
4
|
class Myuser < ApplicationRecord
enum age:{teens:5, twenties: 0, thirties:1, forties:2, fifties:3, sixties:4} # age
enum birthplace:[:tokyo, :ibaraki, :tochigi, :gunma, :kanagawa] # birthplace
end
|
この状態でWebブラウザを更新すると、正しく表示されます。
1
2
3
4
5
|
Myusers
Name Age Birthplace
taro twenties tokyo Show Edit Destroy
jiro thirties ibaraki Show Edit Destroy
saburo forties tochigi Show Edit Destroy
|
select boxを選択しても、teensが先頭に表示されます。
- システム
エンジニア - なるほど!定義の中で名前を羅列すると、自動的に値を割り当ててくれるのですね。マスターすればプログラムの不具合も減りそうですね。
- プロジェクト
マネージャー - まさにそうです。ただ項目を追加削除する場合は、値がずれてしまうので固定値を指定する必要がありますので、お忘れなく。
まとめ
いかがでしたでしょうか。
今回は、Ruby on Railsでのenumの使い方について説明しました。また、enumの設定方法や、それに合わせたViewの修正方法もご紹介しました。
ぜひご自身でRailsのソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)