database.ymlにERBが使えます&alias_method_chain

Tsukasa OISHI

 今日は仕事でdatabase.ymlにERBが使えることを教えてもらった。

<% require '/etc/rails/conf/conf.rb ' %>

development:
  adapter: <%= config.db_adpter %>
  database: <%= config.db_name %>
  username: <%= config.username %>
  password: <%= config.password %>
  socket: <%= config.db_socket %>
...
()

としてあげて、conf.rbには

def config
  Class.new do
    def db_adpter; 'mysql' end
    def db_name; 'sample_development' end
    def username; 'test' end
    def password; 'test_pass' end
    def db_socket; '/var/run/mysqld/mysqld.sock'
  end.new
end

としてあげるとOK。
今まではひとりで開発していたのでそれほど気にしていなかったけど、こういうやり方をすればどんな環境でもdatabase.ymlを変更する必要がないですね。

 Railsでメソッドをオーバライドするときはalias_method_chainという機能が便利。

class Tsukasa
  def like
    'バイク'
  end
end

これに、事前に標準入力を受け付ける処理を追加してオーバライドします。

class Tsukasa
  def like_with_question
    puts "言葉を入力してください"
    if gets == 'nsr'
      like_without_question
    else
      puts "バイクじゃない"
    end
  end
  alias_method_chain :like, :question
end

like_with_questionがlikeメソッドをオーバーライドするもので、like_without_questionががオーバライド前のメソッドを呼び出します。継承だったらsuperとか使えるだろうけど……。alias_mehod_chanはオーバライド前後のメソッドを指定してあげます。