YAMLで設定情報を管理する

Rails で設定情報を保存する場合、ソースコード上に直に書いていく方法くらいしか知らなかったのですが、
YAML で設定情報を定義できることを知りました。

実現するためにconfiggem を使うようです。
こちらを使ってみます。

それでは本編です。

目次

参考

実行環境

  • macOS Mojave 10.14.4

導入

前提条件

Rails アプリの作成をMacbook 上で rbenv を使って、Rails 環境を準備したら詰まったの手順に倣って進めておく。

config をインストール

Gemfile に config gem を書き足す。

Gemfileに追加
1
gem 'config'

書き足したら、以下の通りコマンド実行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# パッケージインストール
bundle install --path=vendor/bundle

# config gemのファイル生成。
rails g config:install

# 実行することで以下のファイルとディレクトリが生成編集される。
# create config/initializers/config.rb
# create config/settings.yml
# create config/settings.local.yml
# create config/settings
# create config/settings/development.yml
# create config/settings/production.yml
# create config/settings/test.yml
# append .gitignore

settings ディレクトリ以下は、実行環境に基づいて定義を読み込む設定ファイル。

設定してみる。

yaml に設定するような config ってなんだろうかと考えていたら、このブログの作成に使っている Hexo を思い出しました。
Web サイトのタイトルを yaml で設定してみます。

yaml を編集

config/settings.yml を以下のように編集します。

config/settings.yml
1
title: Blogのタイトル(仮)

view を編集

views/layouts/application.html.erb を編集します。
<h1><%= Settings.blogtitle %></h1>を追加します。

views/layouts/application.html.erb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<head>
<title>Settings</title>
<%= csrf_meta_tags %>
<%= csp_meta_tag %>

<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>

<body>
<h1><%= Settings.blogtitle %></h1>
<%= yield %>
</body>
</html>

これらを準備してbundle exec rails sで実行し、確認すると以下の表示が確認できます。

yaml に記述したBlogのタイトル(仮)が、表示できていることが確認できました。


実行環境で値を変えてみる

今度は実行モードで、値を変えてみます。
まずは、yaml を編集。

yaml を編集

config/settings/development.yml と config/settings/test.yml を編集します。

config/settings/development.yml
1
execmode: 現在developmentです
config/settings/production.yml
1
execmode: 現在productionです

view を編集

views/layouts/application.html.erb を編集します。
<h1><%= Settings.blogtitle %></h1>を追加します。

views/layouts/application.html.erb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<head>
<title>Settings</title>
<%= csrf_meta_tags %>
<%= csp_meta_tag %>

<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>

<body>
<h1><%= Settings.blogtitle %></h1>
<h2><%= Settings.execmode %></h2>
<%= yield %>
</body>
</html>

動作確認

bundle exec rails sで実行すると、表示は以下のようになります。

今度は、RAILS_SERVE_STATIC_FILES=true bundle exec rails s -e productionで実行します。
今回は nginx などの Web サーバーは用意しないのでRAILS_SERVE_STATIC_FILES=trueを与えて puma に CSS などを配信させます。
(production 用の DB の作成などは先にしておく)

Settings.execmodeで与えた部分の表示を実行モードで変えることができました。

開発環境でのパラメータ、本番でのパラメータというような切り替えが簡単にできます。


今回は、configを使って yaml で定義した値を扱ってみました。
データベースに持つほどではないけど、ある程度定数値を管理したいとか、今回みたいなブログのタイトルを view に直接書きたくない。
といった場合に活躍してくれそうです。

ではでは。