web-dev-qa-db-ja.com

Rails app?のカスタム構成オプションを作成する最良の方法

Railsアプリケーション。1つの構成オプションを作成する必要があります。すべての環境で同じにすることができます。environment.rbで設定すると、ビューで使用できます。それはまさに私が欲しいものです...

environment.rb

AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda

よく働く。

しかし、私は少し不安です。これは良い方法ですか?もっとヒップな方法はありますか?

131
Ethan

データベーステーブルに保存する必要のない一般的なアプリケーション構成の場合、config.ymlファイルconfigディレクトリ内。たとえば、次のようになります。

defaults: &defaults
  audiocast_uri_format: http://blablalba/blabbitybla/yadda

development:
  <<: *defaults

test:
  <<: *defaults

production:
  <<: *defaults

この構成ファイルは、config/initializersのカスタム初期化子からロードされます。

# Rails 2
APP_CONFIG = YAML.load_file("#{Rails_ROOT}/config/config.yml")[Rails_ENV]

# Rails 3+
APP_CONFIG = YAML.load_file(Rails.root.join('config/config.yml'))[Rails.env]

Rails 3を使用している場合、相対構成パスに誤って先頭のスラッシュを追加しないようにしてください。

その後、次を使用して値を取得できます。

uri_format = APP_CONFIG['audiocast_uri_format']

詳細については this Railscast をご覧ください。

189
John Topley

Rails 3バージョンの初期化コードは次のとおりです(Rails_ROOTおよびRails_ENVは非推奨です)

APP_CONFIG = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env]

また、Ruby 1.9.3はマージキーの大文字と小文字を区別するPsychを使用するため、設定ファイルを変更してそれを考慮に入れる必要があります。

defaults: &DEFAULTS
  audiocast_uri_format: http://blablalba/blabbitybla/yadda

development:
  <<: *DEFAULTS

test:
  <<: *DEFAULTS

production:
  <<: *DEFAULTS
82
David Burrows

レール> = 4.2

YAMLファイルをconfig/ディレクトリに作成するだけです(例:config/neo4j.yml)。

neo4j.ymlのコンテンツは以下のようになります(簡単にするために、すべての環境でデフォルトを使用しました):

default: &default
  Host: localhost
  port: 7474
  username: neo4j
  password: root

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default

config/application.rb

module MyApp
  class Application < Rails::Application
    config.neo4j = config_for(:neo4j)
  end
end

これで、カスタム設定に次のようにアクセスできます。

Rails.configuration.neo4j['Host'] #=>localhost
Rails.configuration.neo4j['port'] #=>7474

詳細情報

Rails公式APIドキュメントでは、config_forメソッドについて次のように説明しています。

現在のRails env。のconfig/foo.ymlをロードするのに便利です。


yamlファイルを使用したくない場合

As Rails公式ガイドによると:

config.xプロパティの下のカスタム構成でRails構成オブジェクト)を使用して独自のコードを構成できます。

config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries  = 3
config.x.super_debugger = true

これらの構成ポイントは、構成オブジェクトを介して利用できます。

Rails.configuration.x.payment_processing.schedule # => :daily
Rails.configuration.x.payment_processing.retries  # => 3
Rails.configuration.x.super_debugger              # => true
Rails.configuration.x.super_debugger.not_set      # => nil

config_forメソッドの公式リファレンス | Official Rails Guide

48

ステップ1: config/initializers/appconfig.rbを作成します

require 'ostruct'
require 'yaml'

all_config = YAML.load_file("#{Rails.root}/config/config.yml") || {}
env_config = all_config[Rails.env] || {}
AppConfig = OpenStruct.new(env_config)

ステップ2: config/config.ymlを作成します

common: &common
  facebook:
    key: 'asdjhasxas'
    secret : 'xyz'
  Twitter:
    key: 'asdjhasxas'
    secret : 'abx'

development:
  <<: *common

test:
  <<: *common

production:
  <<: *common

ステップ3:コードの任意の場所で定数を取得する

facebook_key = AppConfig.facebook['key']
Twitter_key  = AppConfig.Twitter['key']
25
Omer Aslam

Rails 4.2および5の最新のクールなものに合わせてこれを更新したかったので、これをconfig/**/*.rbファイル:

config.x.whatever = 42

(そして、それはそこにあるリテラルx、つまりconfig.x.は文字通りそれでなければならず、xの後に必要なものを追加できます。

...これはアプリで次のように利用できます:

Rails.configuration.x.whatever

詳細はこちらをご覧ください: http://guides.rubyonrails.org/configuring.html#custom-configuration

17
smathy

このトピックに関する追加情報:

APP_CONFIG = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env].with_indifferent_access

「.with_indifferent_access」を使用すると、文字列キーまたは同等の記号キーを使用して、ハッシュの値にアクセスできます。

例えば。
APP_CONFIG['audiocast_uri_format'] => 'http://blablalba/blabbitybla/yadda'APP_CONFIG[:audiocast_uri_format] => 'http://blablalba/blabbitybla/yadda'

純粋に便利なことですが、キーをシンボルとして表すことを好みます。

6
foomip

Rails 3.0/3.1にはJohnに似たものを使用しますが、erbで最初にファイルを解析します。

APP_CONFIG = YAML.load(ERB.new(File.new(File.expand_path('../config.yml', __FILE__)).read).result)[Rails.env]

これにより、必要に応じて、herokuのredistogoのURLを読むなど、構成でERBを使用できます。

production:
  <<: *default
  redis:                  <%= ENV['REDISTOGO_URL'] %>
5
Jack Chu

Rails 4

database_configuration

*.yml、私の場合はredis設定ファイルが必要でした。

config/redis.yml

default: &default
  Host: localhost
  port: 6379

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default
  Host: <%= ENV['ELASTICACHE_Host'] %>
  port: <%= ENV['ELASTICACHE_PORT'] %>

次に、構成をロードします

config/application.rb

module MyApp
  class Application < Rails::Application

    ## http://guides.rubyonrails.org/configuring.html#initialization-events
    config.before_initialize do
      Rails.configuration.redis_configuration = YAML.load_file("#{Rails.root}/config/redis.yml")
    end

  end
end

値にアクセスします。

Rails.configuration.redis_configuration[Rails.env]にアクセスできる方法と同様database.yml 沿って Rails.configuration.database_configuration[Rails.env]

2
twmulloy

Omer Aslamのエレガントなソリューションに基づいて、キーをシンボルに変換することにしました。唯一の変更点は次のとおりです。

all_config = YAML.load_file("#{Rails.root}/config/config.yml").with_indifferent_access || {}

これにより、シンボルとして値をキーとして参照できます。

AppConfig[:Twitter][:key]

これは私の目にはきれいに見えます。

(私の評判はOmerの返信にコメントするほど高くないので、回答として投稿しました)

1
Kitebuggy

simpleconfig が好きです。環境ごとの構成が可能です。

0
Jerry Cheung

Rails initializeの前に設定をロードする私の方法

Rails初期化の設定を使用し、環境ごとに設定を構成できます。

# config/application.rb
Bundler.require(*Rails.groups)

mode = ENV['Rails_ENV'] || 'development'
file = File.dirname(__FILE__).concat('/settings.yml')
Settings = YAML.load_file(file).fetch(mode)
Settings.define_singleton_method(:method_missing) {|name| self.fetch(name.to_s, nil)}

次の2つの方法で設定を取得できます。Settings ['email']またはSettings.email

0
greenif

アプリケーションパラメータを保存するのに最適な場所はどこですか:データベース、ファイル、コード...?

別のファイルへの単純な参照であるという点でのバリエーション。 environment.rbは絶えず更新されておらず、アプリ固有のヒープが含まれていないことがわかります。 「Rails way?」という質問に対する具体的な答えではありませんが、おそらくそれについていくつかの議論があるでしょう。

0
Straff

グローバルアプリケーションスタックから設定にアクセスすることを好みます。ローカルスコープの過剰なグローバル変数を回避します。

config/initializers/myconfig.rb

MyAppName::Application.define_singleton_method("myconfig") {YAML.load_file("#{Rails.root}/config/myconfig.yml") || {}}

そしてそれにアクセスします。

MyAppName::Application.myconfig["yamlstuff"]
0
6ft Dan

Setting.ymlが見つからない場合にメッセージを上げるカスタム設定への私の最善の方法。

config/initializers/custom_config.rbのカスタム初期化子からロードされます

setting_config = File.join(Rails.root,'config','setting.yml')
raise "#{setting_config} is missing!" unless File.exists? setting_config
config = YAML.load_file(setting_config)[Rails.env].symbolize_keys

@APP_ID = config[:app_id]
@APP_SECRET = config[:app_secret]

Config/setting.ymlにYAMLを作成します

development:
  app_id: 433387212345678
  app_secret: f43df96fc4f65904083b679412345678

test:
  app_id: 148166412121212
  app_secret: 7409bda8139554d11173a32222121212

production:
  app_id: 148166412121212
  app_secret: 7409bda8139554d11173a32222121212
0
Marcelo Austria