ぬまのそこ

namazuのゆるいエンジニアブログ

Ruby YAMLファイルを読み込んでメソッドで値を取れるクラス

今日したこと

にゃーん って感じ。 カルシウム足りないんじゃないのってくらい情緒不安定だった。

愚痴ってもしょうがないので、さっきちょっと作ったコードを載せて今日はおわり。

やりたかったこと

env1:
  obj1: hello
  obj2:
    obj2_1: hello
    obj2_2: hello
env2:
  obj1: hello

こんなconfi.ymlみたいなのがある。 一番大本が環境毎。 そのしたにyaml

これを

config = Config.new('env1')
config.obj1 #=> 'hello'
config.obj2.obj2_1 #=> 'hello'

みたいに使いたかった。 

これをやるGemは当然既にあるだろうし、いつもはEasySettingsっていうGemを使っている。 ただせっかくだし自前でちょろっとつくった。たいした用途ではなかったしね。

とりあえず思いついたのがこれ。 メソッド名で出すからハイフンが使えなかったり色々あるけど。

require 'yaml'

class Config
  CONFIG_FILE_NAME = './config.yml'

  def initialize(env)
    config = YAML.load_file(CONFIG_FILE_NAME)
    hash_method_define = Proc.new do |res, obj|
      obj.each do |k, v|
        if(v.kind_of?(Hash))
          res_child = Object.new
          hash_method_define.call(res_child, v)
          res.define_singleton_method(k) { res_child }
        else
          res.define_singleton_method(k) { v }
        end
      end
    end
    hash_method_define.call(self, config[env])
  end
end

Rubyってすごいんですね。

どうでもいいはなし

にゃー。 あした大学行きたくない。