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
# パッケージインストール
bundle install --path=vendor/bundle

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

# 実行することで以下のファイルとディレクトリが生成編集される。
# 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
<!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に直接書きたくない。
といった場合に活躍してくれそうです。

ではでは。