레일에서 사용자 정의 구성 변수를 정의하는 방법


337

레일스 애플리케이션에 커스텀 구성 변수를 추가하는 방법과 컨트롤러에서 변수에 액세스하는 방법이 궁금합니다. 컨트롤러.

둘째, s3 액세스, 비밀 키로 yaml 파일을 추가하려면 Rails 앱에서 파일을 초기화하는 방법과 정의한 값에 어떻게 액세스합니까? 해당 구성 파일에서.



약간 관련됨 : 새 구성 변수를 추가 할 때 서버를 다시 시작하는 것을 잊지 마십시오.
Damien Ó Ceallaigh

답변:


165

업데이트 1

권장 사항 : 요즘에는 Rails Config gem을 사용하여 정교한 컨트롤을 제공하고 있습니다.

업데이트 2

빠른 해결책을 원한다면 아래 의 Jack Pratt의 답변 을 확인하십시오 .

아래의 원래 답변은 여전히 ​​작동하지만이 답변은 구식입니다. 업데이트 1과 2를 보는 것이 좋습니다.

원래 답변 :

빠른 솔루션을 위해 Ryan Bates가 캐스팅 한 "YAML 구성 파일" 화면을 보는 것이 매우 유용합니다.

요약해서 말하자면:

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

# application.rb
if APP_CONFIG['perform_authentication']
  # Do stuff
end

62
이 답변은 구식입니다. 아래 stackoverflow.com/questions/1450285/… 참조
mattwynne

8
@matt : Rails 3이 출시되었거나 모두 가 Rails 3을 사용하고 있기 때문에 구식 입니까?
Lasse V. Karlsen

오래된 것을 지적 해 주셔서 감사합니다. 나는 Rails에 대해 싫어합니다 .1 년 전의 코드가 너무 오래되었습니다.
jcollum

2
레일 3+에서 YAML 방법을 사용하고자하는 사람의 경우 교체해야합니다 RAILS_ENV함께 Rails.envRAILS_ROOT함께 Rails.root.
Ryan

rails_config를 시도했습니다. 설명서에서 그들은 app.rb에 RailsConfig를 등록하도록 지시합니다. app.rb = config / application.rb라고 가정합니다. 그러나 application.rb의 어디에서 register RailsConfig 라인을 넣어야합니까?
Nhím Hổ Báo

375

Rails 3에서 애플리케이션 특정 커스텀 구성 데이터는 애플리케이션 구성 객체에 배치 될 수 있습니다. 초기화 파일 또는 환경 파일에서 구성을 지정할 수 있습니다 (예 MyApp: 특정 응용 프로그램의 경우) .

MyApp::Application.config.custom_config_variable = :my_config_setting

또는

Rails.configuration.custom_config_variable = :my_config_setting

설정을 읽으려면 설정하지 않고 구성 변수를 호출하면됩니다.

Rails.configuration.custom_config_variable
=> :my_config_setting

레일 업데이트 4

Rails 4에는 이것을위한 새로운 방법이 있습니다 => http://guides.rubyonrails.org/configuring.html#custom-configuration

여기에 이미지 설명을 입력하십시오


11
그것은 나를 위해 작동합니다. 환경 별 구성 설정을 environment / {environment} .rb에 넣습니다 (예 : environment / development.rb). 수정 후 서버를 다시 시작해야합니다. 더 우아한 기술이있을 수 있지만 이전에 동일한 파일에서 ENV [ 'XXX']를 사용한 기존 앱을 업그레이드하고 있으며 업그레이드 중에 리팩토링의 양을 제한하고 싶기 때문에 잘 작동했습니다.
pduey

13
이것은 과제이지만 어떻게이 값에 액세스합니까?
kevzettler

9
rails 3.x 앱의 application.rb를 보면이 답변에 따라 "응용 프로그램 구성이 config / initializers의 파일로 들어가야합니다"라고되어 있습니다. 변수에 액세스하는 방법에 대한 많은 문서가 있습니다 ( edgeguides.rubyonrails.org/configuring.html ). 예를 들어, initializers 폴더에 some_variables.rb라는 파일에서 위에 설명 된대로 변수를 배치하고 (앱 이름으로 MyApp을 대체) 사용하려는 경우 config.custom_config_variable을 호출하면됩니다. 물론 원하는 변수 이름을 사용할 수 있습니다. . @ Jack Pratt 더 완전한 답변을 편집 할 수 있습니까?
jamesc

48
친구, 단순 : 경로 : config/environments/production.rb 구성 : config.whatever = false 어디서나 액세스 : Rails.configuration.whatever
Victor S

5
프로덕션 환경에서만 무언가를 설정하고 다른 환경에서 액세스하려고하면 불평 할 수 undefined method있습니다.
lulalala

69

Rails 3.0.5에서는 다음과 같은 접근 방식이 효과적이었습니다.

config/environments/development.rb쓰기

config.custom_config_key = :config_value

custom_config_key그런 다음 값 을 사용하여 다른 파일에서 값 을 참조 할 수 있습니다.

Rails.application.config.custom_config_key

4
프로덕션 환경에서만 무언가를 설정하고 다른 환경에서 액세스하려고하면 불평 할 수 undefined method있습니다.
lulalala

레일 4.1에서이 작업을 시도했는데 method_missing': undefined method # <Rails :: Application :: Configuration : 0x007f9f735b7240> ... "에 대해 "... store "라는 오류가 발생합니다 . "config.store.works"구성 변수를 추가하려고했습니다.
Spundun

1
@Spundun Rails가 무엇인지 모르기 때문에 오류가 발생했습니다 store. 이 답변의 방법을 사용하려면 변수의 이름을 바꾸 store_works거나 정의 된 config.store블록을 만들 works수 있습니다.
Paul Pettengill

고마워, 나는 결국 그것을 알아 냈습니다. 이것들은 중첩 된 해시이므로 구성 이름에 점을 사용하려면 빈 해시를 재귀 적으로 초기화해야합니다.
Spundun

31

이것은 레일 3.1에서 작동합니다.

config / environment.rb (또는 특정 환경을 대상으로하는 config / environments / ..)에서 :

YourApp::Application.config.yourKey = 'foo'

컨트롤러 또는 다음과 같은 뷰에서 액세스 할 수 있습니다.

YourApp::Application.config.yourKey

(App은 애플리케이션 이름으로 바꿔야합니다.)

노트 : Ruby 코드이므로 구성 키가 많은 경우 다음을 수행 할 수 있습니다.

config / environment.rb에서 :

YourApp::Application.configure do
  config.something = foo
  config.....
  config....
  .
  config....
end

2
camelCase : o snake_case를 사용하십시오!
siegy22

30

레일 4

사용자 정의 변수를 yaml 파일에 넣었다고 가정합니다.

# config/acme.yml
development:
  :api_user: 'joe'
  :api_pass: 's4cret'
  :timeout: 20

이니셜 라이저를 작성하여로드하십시오.

# config/initializers/acme.rb
acme_config = Rails.application.config_for :acme

Rails.application.configure do
  config.acme = ActiveSupport::OrderedOptions.new
  config.acme.api_user = acme_config[:api_user]
  config.acme.api_pass = acme_config[:api_pass]
  config.acme.timeout  = acme_config[:timeout]
end

이제 앱 어디에서나 다음과 같은 값에 액세스 할 수 있습니다.

Rails.configuration.acme.api_user

Rails.application.config_for :acme로드하여 acme.yml올바른 환경을 사용하는 것이 편리 합니다.


21

추가 gem없이 Rails 4.2 부터을 사용하여 간단히 config / hi.yml을 로드 할 수 있습니다 Rails.application.config_for :hi.

예를 들면 다음과 같습니다.

  1. touch config/passwords.yml

        #config/passwords.yml
        development:
          username: 'a'
          password: 'b'
        production:
          username: 'aa'
          password: 'bb'
  1. touch config/initializers/constants.rb

    #config/initializers/constants.rb
    AUTHENTICATION = Rails.application.config_for :passwords
  1. 이제 AUTHENTICATION응용 프로그램의 어느 곳에서나 상수 를 사용할 수 있습니다.

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
  2. 그런 다음 passwords.yml.gitignore :에 추가 하고 echo /config/passwords.yml >> .gitignore편의를 위해 예제 파일을 cp /config/passwords.yml /config/passwords.example.yml만든 다음 실제 프로덕션 값으로 프로덕션 콘솔에서 예제 파일을 편집하십시오.


13

Rails 4.2의 최신 멋진 기능을 위해 이것을 업데이트하고 싶었습니다. 이제 모든 config/**/*.rb파일 에서이 작업을 수행 할 수 있습니다.

config.x.whatever.you.want = 42

... 앱에서 다음과 같이 사용할 수 있습니다.

Rails.configuration.x.whatever.you.want

자세한 내용은 여기를 참조하십시오 : http://guides.rubyonrails.org/configuring.html#custom-configuration



4

YAML 설정을위한 간단한 플러그인을 만들었습니다 : Yettings

khelll의 답변 코드와 비슷한 방식으로 작동하지만이 YAML 구성 파일 만 추가하면됩니다.

app/config/yetting.yml

플러그인은 다음과 같이 앱에서 클래스 메소드로 YML 설정에 액세스 할 수있는 클래스를 동적으로 작성합니다.

Yetting.your_setting

또한 고유 한 이름을 가진 여러 설정 파일을 사용하려는 경우 다음과 같이 app / config의 하위 디렉토리에 배치 할 수 있습니다.

app/config/yettings/first.yml
app/config/yettings/second.yml

그런 다음 다음과 같은 값에 액세스 할 수 있습니다.

FirstYetting.your_setting
SecondYetting.your_setting

또한 환경별로 재정의 할 수있는 기본 설정을 제공합니다. yml 파일 내에서 erb를 사용할 수도 있습니다.


: 공식 환매 특약은 지금 github.com/charlotte-ruby/yettings (SO 검토가 사소한 너무 말을 내 편집 거부)
lulalala


4

Heroku를 사용하거나 응용 프로그램 설정을 환경 변수로 유지 해야하는 경우 figaro gem이 매우 유용합니다.


2

웹 인터페이스를 통해 변경해야하는 전역 구성 값에 레일 설정 을 사용하고 싶습니다 .


2
나는 레일을 배우면서 추가 플러그인 등을 사용하고 싶기 때문에 가장 좋은 방법은 플러그인이없는 것입니다.
Shiv

이것은 데이터베이스를 사용하여 구성을 저장하는데 일부 사람들에게는 너무 무거울 수 있습니다.
lulalala

0

우리가 직장에서 시작한 것은 ActiveSupport Ordered Hash입니다.

환경 파일 내부에서 구성을 깔끔하게 정의 할 수 있습니다.

config.service = ActiveSupport::OrderedOptions.new
config.service.api_key = ENV['SERVICE_API_KEY']
config.service.shared_secret = ENV['SERVICE_SHARED_SECRET']

-5

응용 프로그램의 구성을 처리하는 방법에 대한 좋은 접근 방식을 제안합니다. 세 가지 기본 규칙이 있습니다.

  • 코드가 아닌 구성을 변경하십시오.
  • 조건에 따라 구성을 사용하십시오.
  • 무언가를 의미하는 코드를 작성하십시오.

보다 자세한 개요를 보려면 다음 링크를 따르십시오 . 올바른 방법으로 레일 구성

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