Rails 앱을위한 커스텀 설정 옵션을 만드는 가장 좋은 방법은 무엇입니까?


133

Rails 애플리케이션에 대해 하나의 구성 옵션을 만들어야합니다. 모든 환경에서 동일 할 수 있습니다. 에 설정하면 environment.rb내보기에서 사용할 수 있다는 것을 알았습니다.

environment.rb

AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda

잘 작동합니다.

그러나 나는 조금 불안합니다. 이것이 좋은 방법입니까? 더 진보적 인 방법이 있습니까?

답변:


191

데이터베이스 테이블에 저장할 필요가없는 일반적인 응용 프로그램 구성을 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']

자세한 내용은 이 Railscast 를 참조 하십시오.


1
당신은해야 할 수도 있습니다 YAML::ENGINE.yamler = 'syck'작업이에 대한 stackoverflow.com/a/6140900/414220
evanrmurphy

45
그냥 참고로, 레일 당신이 교체해야 3.X RAILS_ENVRails.envRAILS_ROOT함께 Rails.root.
JeanMertz

5
Rails 3+의 경우 절대 경로가 아닌 상대 경로를 결합해야합니다. 설정 디렉토리 앞에 슬래시를 붙이지 마십시오.
wst

10
이전 버전에 대해서는 확실하지 않지만 Rails 4.1에서는 다음을 수행 할 수 있습니다.Rails.application.config.whatever_you_want = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env]
d4rky

2
@ iphone007 실제로 config 디렉토리에서 임의의 yaml 파일을로드 할 수 있습니다. smathy의 대답을 아래에서 참조하십시오 .
omnikron

82

초 기자 코드의 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

3
당신은 필요하지 않습니다 "#{Rails.root.to_s}";"#{Rails.root}"공장.
David J.

3
Rails.root.join('config', 'config.yml')대신 권장 합니다"#{Rails.root.to_s}/config/config.yml"
David J.

2
그리고 APP_CONFIG 대신 다음을 사용하는 것이 좋습니다.AppName::Application.config.custom
David J.

1
David, 처음 두 의견은 모범 사례이며 코드를 수정하지만 마지막으로 남겨 두어야 할 것은이 코드를 사용할 때마다 AppName을 변경해야한다는 것을 의미합니다.
David Burrows

53

레일> = 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 환경에 대한 config / foo.yml을로드하기위한 편의성


yaml파일 을 사용하지 않으려는 경우

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분석법 공식 참조 | 공식 레일 가이드


25

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']

config.yml에서 ENV 변수를 읽는 방법, 구성이 동일합니다. bashrc에 변수를 추가했으며 config.yml에서 키를 사용하여 해당 변수를 읽으려고합니다. <% = ENV [URL] %> ... this 작동하지 않습니다
shiva

@shiva ENV 변수는 Figaro gem을 살펴보십시오. 이 구성 설정은 소스 제어에서 숨길 필요가없는 값을위한 것입니다.
Shadoath

17

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


3
처음에는 저에게 문제를 일으킨 설명 일뿐입니다. x는 당신이 넣고 싶은 것에 대한 자리 표시자가 아니며 실제로 문자이어야합니다 x.
tobinibot

좋은 점 @ tobinibot-그 답을 제 답변에 추가했습니다. 감사합니다.
smathy

가이드가 실제로 'x'를 언급하지 않는다는 점에 흥미가 있지만 Rails 5.0
Don

네 말이 맞아, 이상해-말하곤 했어.
smathy

1
현재 레일 문서에서 : You can configure your own code through the Rails configuration object with custom configuration under either the config.x namespace, or config directly. The key difference between these two is that you should be using config.x if you are defining nested configuration (ex: config.x.nested.nested.hi), and just config for single level configuration (ex: config.hello).출처 : guides.rubyonrails.org/configuring.html#custom-configuration
David Gay

6

이 주제에 대한 추가 정보 :

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'

순전히 편리하지만 키를 기호로 표시하는 것을 선호합니다.


5

John for Rails 3.0 / 3.1과 비슷한 것을 사용하지만 파일을 먼저 구문 분석합니다.

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'] %>

2
나는 이것이 매일 필요하다고 생각하지 않지만, 이것이 필요할 때 정말 멋진 솔루션입니다. 레일 규칙과 일치하도록 파일 이름을 config.yml.erb로 변경한다고 생각합니다.
Andrew Burns

2

Rails 4

사용자 정의 구성 yaml을 작성하고 방법과 유사한 방식으로로드하여 앱에서 사용 가능하게하려면 database_configuration .

당신 만들기 *.yml, 내 경우에는 내가 레디 스 구성 파일을 필요로했다.

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]


현재 환경에 대한 설정 만 사용하면 시간을 절약 할 수 있습니다. 어쩌면 필요한 유일한 환경 일 것 Rails.configuration.redis_configuration = YAML.load_file("#{Rails.root}/config/redis.yml")[Rails.env]입니다. 그러나 레일 4.2 이상에서 smathy의 대답 은 아마도 더 간단한 방법 일 것입니다.
omnikron

1

Omer Aslam의 우아한 솔루션을 기반으로 키를 기호로 변환하기로 결정했습니다. 유일한 변화는 :

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

이를 통해 기호로 값을 키로 참조 할 수 있습니다. 예 :

AppConfig[:twitter][:key]

이것은 내 눈에 더 깔끔한 것 같습니다.

(내 평판이 Omer의 답변에 대해 언급 할만 큼 높지 않기 때문에 답변으로 게시 됨)



0

에 대한 내 답변을 참조하십시오 응용 프로그램 매개 변수를 저장하는 가장 좋은 장소는 어디에 있습니까 : 데이터베이스, 파일, 코드 ...?

다른 파일에 대한 간단한 참조라는 점에서 변형입니다. environment.rb가 지속적으로 업데이트되지 않고 거기에 응용 프로그램 관련 내용이 없습니다. 당신의 질문에 대한 구체적인 대답은 아니지만, 그것이 Rails 방식입니까?


0

글로벌 응용 프로그램 스택을 통해 설정에 액세스하는 것을 선호합니다. 로컬 범위에서 초과 전역 변수를 피합니다.

config / initializers / myconfig.rb

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

그리고 그것에 접근하십시오.

MyAppName::Application.myconfig["yamlstuff"]

0

Rails 초기화 전에 설정을로드하는 방법

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)}

Settings [ 'email'] 또는 Settings.email의 두 가지 방법으로 설정을 가져올 수 있습니다.


0

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.