開発ハウツー

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の設定

<

pre class=”code” data-lang=”” data-unlink># 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の楽さもたくさん感じます笑

ABOUT ME
maru
maru
オーマイガー東京(編集長)/キグルミだ熱狂(gt, 作詞作曲)/新卒2年目エンジニアです。赤坂と浅草におります。最近作った→ https://lgtmeow3.tokyo

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください