Railsの個別設定情報はどこに書くのか

Amazon S3やBit.lyのAPIを使うのに、ユーザー名やAPIキーをアプリごとに管理する必要がある。こうした情報はどこに書くのが正しいのだろうか。

Ryan BatesのawesomenessなRailscastの第85回に、やり方があった。YAMLファイルで用意しておいて、よしなに読み込む。

# config/config.yml

bitly:
    username: myname
    apikey: R_abcdefg

とかしておいて、

# config/initializers/load_config.rb
APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")

と初期化時に読みこむ。Rails3では環境変数RAILS_ROOTではなくRails.rootとしてディレクトリを取る。developmentとかproductionでAPIキーを変えるとかなら、もう1階層YAMLを深くすればいい。

class ItemsController < ApplicationController

      :
      :

  def populate_retweet(item)
    conf = APP_CONFIG["bitly"]
    bitly = Bitly.new(conf["username"], conf["apikey"])

    url = bitly.shorten(item.url)
    item.bitly_url = url.short_url
    item.retweet   = url.global_clicks
  end

end

とかやるといいらしい。いや、メソッドのなかでいちいちAPP_CONFIG定数のハッシュを読むのなんてあり得ないのだけど、えーと、こういうのって、コントローラのクラス変数とかにしていいのかしら。after_initializeというフックがあるようだけど、うーん。

after_initializeはオブジェクトが生成されるたびに実行されるので、やっぱりクラス変数に書くのが正解かな?

class ItemsController < ApplicationController

  conf = APP_CONFIG["bitly"]
  @@bitly = Bitly.new(conf["username"], conf["apikey"])

  def create
    @user = User.find(params[:user_id])

   :
   :

  def populate_retweet(item)
    url = @@bitly.shorten(item.url)
    item.bitly_url = url.short_url
    item.retweet   = url.global_clicks
  end

end