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