Railsで定数の指定方法は複数あります。
ApplicationControllerに書く
これだとコントローラ同士で有効になります。
ApplicationCotnroller < ActionController::Base
NUM = 1
...
end
別なコントローラでもつかえる。
BookController < ApplicationController
def read
## ここに定数いれる
@number = NUM
end
end
config/initializers/constants.rbで宣言
module Constants
## Constants::NUMでアクセスできる
NUM = 1
end
## こっちはTITLEでアクセスできる
TITLE = 'Story Of The Ring'
ProductionとDevelopmentで分ける
constants.rbに書いたうえで、
if Rails.env == "production"
## 本番の定数
else
## 開発の定数
end
SettingsLogic
class Settings < Settingslogic
source "#{Rails.root}/config/application.yml"
namespace Rails.env
end
initializeの下にこう書いてから、configの下にapplication.ymlとかを用意します。
# config/application.yml
defaults: &defaults
artist:
band: Oasis
development:
<<: *defaults
test:
<<: *defaults
production:
<<: *defaults
とかやるとこんな感じでアクセスできます。
Settings.artist.band # > Oasis
20201005
今リポジトリ確認したら最終更新六年前とかで、もう使うのやめた方がいい気がしました。
confg
最近(20201005)はこちら主流かな。定数管理のGemです。これを書いてbundleします。
gem 'config'
RailsのAppの下にconfig/settings
に設定ファイルを置きます。
config/settings/
├── development.yml
├── production.yml
└── test.yml
本番は環境変数でいいなあとか。
admin:
url: <%= ENV['ADMIN_DOMAIN'] %>
開発はベタでいい場合の使い分けができます。
admin:
url: https://admin.なんたらかんたら.local
もちろん共通のもかけます。その場合は以下のファイルに記述します。
config/settings.yml
読み出しはこうですね。
Settings.admin[:url]
Railsデフォルトでもconfig使える
application.rbに定義。
config.x.preference = config_for(:default_settings).deep_symbolize_keys
こうかく。
## config/default_settings.yml
default: &default
foo:
- bar
- baz
development:
<<: *default
test:
<<: *default
production:
<<: *default
Rails標準configの落とし穴
自分は環境固有の設定のためにgemを使ってるんだけど、これをRailsの機能に統合したいっス。でも自分の設定はネストが深すぎて、現在のRails::Application#config_forでは設定のマージができないんスよ
これを
# config/application.yml
shared:
foo:
bar:
baz: 1
development:
foo:
bar:
qux: 2
こうさせてくれんかのう。
# currently
config_for(:application)[:foo][:bar] #=> { qux: 2 }
# I expect
config_for(:application)[:foo][:bar] #=> { baz: 1, qux: 2 }
マージできないから両方できるようにさせてくれえっていうPRなんだけど、同じキーで本番の設定を開発でつかっちゃうとか起こりそうなので気持ち悪いですね。
定数を扱う時は大人しくGemつかっとくのが良さそうです。
(このPRマージされてるんだが事故った話とかそのうちどこかの会社の開発ブログであがりそうですね)