YAMLファイルの読み込みと場所の指定

Ruby on Railsアプリケーションにおいて,実行環境依存で設定を変更したくなるときがある。昨日一応の完成を見た僕の処女作では,最初にログインする際のパスワードについて,正解のパスワードをデータベースからではなく,ファイルから読み込ませるようにしたかった。しかし,IntegrationテストやFunctionalテストのコード中にログイン処理のテストをコーディングする際に,正解のパスワードを記載しなければならないため,production時の正解のパスワードではなく,開発時もしくはテスト時には別途バレてもいい適当なパスワードとしたかった。

パスワードを記述しておくファイルは,configディレクトリ内にYAML形式で作っておく。ファイル名はここでは「auth.yml」としておこう。パスワードは平文ではなく,MD5のハッシュ値を記述している。developmentとtestのパスワードは,ここでは”pass”としている。上記のハッシュ値は,developmentとtestは”pass”のMD5にかけた結果であり,productionのものはそれっぽく適当に書いたものである。

development: password: 1a1dc91c907325c69271ddf0c944bc72 test: password: 1a1dc91c907325c69271ddf0c944bc72 production: password: 9b2f224d75fda7f83542a2660e97d3dd

このファイルを読み込むときは,YAMLクラスのloadメソッドを使用する。実行環境については,RAILS_ENVに”development”とか”test”などの文字列が入っているので,それを利用してauth.ymlファイル内の欲しいものを取得する。

authconfig = YAML::load(File.open(‘config/auth.yml’)) password = authconfig[RAILS_ENV][‘password’]

これで実行環境に応じた正解パスワードの取得が行えるようになった,と思ってしまった僕は負け組。

auth.ymlファイルの場所を相対パスで記述しているが,これは実行時のカレントディレクトリがアプリケーションのトップディレクトリであることを前提にした記述。自宅サーバの「 約5時間かかったRuby on Railsの実行環境構築」で紹介したapache+lighttpdな環境では,実行時のカレントディレクトリがpublicディレクトリであったために,auth.ymlファイルが見つからずにエラーとなってしまった。

いちいち本番環境配備時にコードに手を入れて対応するのは面倒なので,カレントディレクトリがどこになろうとも動作するように書き換える。まず思いついたのは,auth.ymlファイルを読み込む処理を記述したファイルのパスは”FILE“変数で取得可能なために,ここを起点に指定する方法。

authconfig = YAML::load(File.open(File.dirname(FILE) + ‘/../../config/auth.yml’)) password = authconfig[RAILS_ENV][‘password’]

「File::join()使えよ」的な指摘は置いておいて,とりあえず上記のコードでカレントディレクトリがどこであろうともauth.ymlファイルを見つけることができるようになった。もう一つ,railアプリのルートディレクトリを持っているRAILS_ROOT変数を使って,

authconfig = YAML::load(File.open(File.join(RAILS_ROOT, ‘config’, ‘auth.yml’))) password = authconfig[RAILS_ENV][‘password’]

とすることも可能である。どちらかといえば,後者の方が個人的には好みだ。

上記の手順は,railsアプリがファイルシステム上に展開されていることが前提。JRubyでrailsアプリをwarファイルにパッケージングしたときにどうコーディングしたらいいのかは,今後の僕の宿題である。

このエントリーをはてなブックマークに追加

関連記事

スマートスピーカーはもう終わったデバイス?

QMK FirmwareとRaspberry Pi PicoでSPLIT_USB_DETECTを使わない方法

40%キーボードに慣れるためにやったこと

Lunakey PicoでQMK Firmwareを動かしてみました

Googleアシスタント向け会話型アクションが1年後にシャットダウンされます