3

ユーザー名やパスワードなどの環境固有の変数用に環境 YAML ファイルをセットアップしました。アプリでこれらの変数を使用するには、APP_CONFIG['username']代わりにを使用する必要がありAPP_CONFIG[:username]ます。どうしてこれなの?代わりに後者を有効にするにはどうすればよいですか? 大きな問題ではありませんが、違いの原因がわからないのが気になります。

config/initializers/load_app_config.rb

APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env]

config/app_config.yml

development:
  username: development_name
  password: secret

production:
  username: production_name
  password: super_secret
4

2 に答える 2

9

デフォルトでは、YAML キーは String としてレンダリングされます。

development:
  username: development_name
  password: secret

によってアクセス可能です

APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env]
APP_CONFIG['development']['username']
# => "development_name"

特定のキーをシンボルにしたい場合は、YAML ファイルでプレフィックスとして : を付ける必要があります。

development:
  :username: development_name
  :password: secret

APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env]
APP_CONFIG['development'][:username]
# => "development_name"
APP_CONFIG['development']['username']
# => nil

これは Ruby 固有の動作であるため、通常は行われません。他の言語は先頭の : に満足しないかもしれません。

特にシンボルとしてキーにアクセスしたい場合は、次のいずれかを使用できますsymbolize_keys!

APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env].simbolize_keys!

しかし、ほとんどの場合、その努力は報われません。内部的には、ライブラリの 90% が比較中にシンボルを文字列に変換します。特に、ハッシュを無差別アクセスで扱う場合はそうです。したがって、この場合、ストーリーの最後に文字列を保持したい場合があります。

最後のオプションは、HashWithIndifferentAccessを作成することです

APP_CONFIG = HashWithIndifferentAccess.new(YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env])

これにより、アクセスできるようになります

APP_CONFIG[:development][:username]
APP_CONFIG['development'][:username]
APP_CONFIG['development']['username']

無関心に。ハッシュキーを内部的に文字列に保存し、リクエストを[]文字列に変換することで機能するため、常に機能します。params[]これは、コントローラーの有名なハッシュを含む、いくつかの Rails コンポーネントで使用されるクラスです。

于 2012-10-03T00:13:30.930 に答える
2

symbolize_keysYAML.load_file によって返されるハッシュで使用

于 2012-10-02T22:57:54.660 に答える