Rubyでyamlファイルに環境別の設定を書いて、さらにERBのコードを使えるようにする
環境別に設定を書く
yamlファイルに環境別の設定情報を書きたい。いわゆるconfig/database.yml
のようなファイル。default値を元に、development
、production
など実行環境ごとに違う設定情報を持たせたい。railsではどうやればいいんだろう。
ファイルとしてはこんな感じ。
default: &default
author: '北村聡士'
development:
<<: *default
#foo: dev
test:
<<: *default
#foo: test
production:
<<: *default
#foo: prod
railsのコードを見てみる
railsのconfiguration.rbを見てみた。
# Loads and returns the entire raw configuration of database from
# values stored in `config/database.yml`.
def database_configuration
path = paths["config/database"].existent.first
yaml = Pathname.new(path) if path
config = if yaml && yaml.exist?
require "yaml"
require "erb"
YAML.load(ERB.new(yaml.read).result) || {}
elsif ENV["DATABASE_URL"]
# Value from ENV['DATABASE_URL'] is set to default database connection
# by Active Record.
{}
else
raise "Could not load database configuration. No such file - #{paths["config/database"].instance_variable_get(:@paths)}"
end
config
rescue Psych::SyntaxError => e
raise "YAML syntax error occurred while parsing #{paths["config/database"].first}. " \
"Please note that YAML must be consistently indented using spaces. Tabs are not allowed. " \
"Error: #{e.message}"
rescue => e
raise e, "Cannot load `Rails.application.database_configuration`:\n#{e.message}", e.backtrace
end
一行だった。これだけ。
YAML.load(ERB.new(yaml.read).result) || {}