オーマイガー東京

オーマイガー東京というブログを24歳東京暮らし新卒2年目のエンジニアが書いています。

SinatraでYAMLにdotenvで環境変数を書く方法

環境が違う人同士、サーバー同士で簡単に環境の差を埋められる便利なgemのdotenvです。

github.com

いつもはrailsでdotenv-railsを使って、database.ymlを設定しているのでつまづいたことがなかったのですが、sinatraでやるとエラーが出ました。 なので、その際の対象法をまとめておこうと思います。

f:id:maru_33:20180304190727p:plain

今回の環境

gemfileの設定

# Gemfile

gem 'dotenv'
gem 'active_record'
gem 'mysql2'

.envの設定

# .env

DB_PASSWORD="hogehoge"
DB_SOCKET="/tmp/mysql.sock"

configの設定

# config.ru

require 'dotenv'
Dotenv.load

require './app.rb'
run Sinatra::Application

database.ymlの設定

# database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: <%= ENV['DB_PASSWORD'] %>
  socket: <%= ENV['DB_SOCKET'] %>

development:
  <<: *default
  database: hoge_development

test:
  <<: *default
  database: hoge_test

production:
  <<: *default
  database: hoge_production

アプリケーションファイルの設定

# hoge.rb

require 'rubygems'
require 'active_record'
require 'mysql2'

ActiveRecord::Base.configurations = YAML::load('./configs/database.yml'))
ActiveRecord::Base.establish_connection(:development)

class Hoge < ActiveRecord::Base

  # hogehoge 

end

実行してみる

上記の設定が終わった後にいけーって感じでrackupすると

Mysql2::Error - Can't connect to local MySQL server through socket '<%= ENV['DB_SOCKET'] %>' (2):

全然読み込めてない。。。 あかんやん

あかんので、ymlを一旦、読み込み、その読み込んだstringをerbとして読み込み、変数を活かした後、その結果をもう一回stringにして、loadして読み込むという感じでいきます。(日本語力が足りない)

ymlを読み込むための対処法

# hoge.rb

require 'rubygems'
require 'active_record'
require 'mysql2'
require 'erb'

ActiveRecord::Base.configurations = YAML::load(ERB.new(File.read('./configs/database.yml')).result)
ActiveRecord::Base.establish_connection(:development)

class Hoge < ActiveRecord::Base

  # hogehoge 

end

これでrackupすると、、、、、

うまくいくはずです!

よかった! Rails使わずにsinatraとかでapp作ると色々勉強になって良いです。 railsの楽さもたくさん感じます笑