2014-10-08 5 views
0

Sinatra (Sinatra :: Configfile 사용)에서 간단한 설정을 얻는 것은 settings.foo과 같이 매우 쉽습니다. 그러나 설정을 계층 구조에 넣어야하는 경우 완전히 수행하는 방법이 명확하지 않습니다 간단하고 직접적인 방법으로 이 가까이동적으로 Sinatra에서 중첩 된 설정 가져 오기

get '/test' do 
    case settings.environment 
    when :production 
    settings.production['foo'] 
    else 
    settings.development['foo'] 
    end 
end 

뭔가 훨씬 더 좋을 것이다, 그러나 이것은 작동하지 않습니다 :

이 고통스럽게 장황

get '/test' do 
    settings[settings.environment]['foo'] 
end 
+0

'settings.send (settings.environment) [ 'foo']'는 어떻습니까? –

+0

그래, 그런 식으로 생각했는데, 더 표준적인 (단순하고 우아한/읽을 수있는) Sinatra 방법을 가정하고있다. – iconoclast

답변

1

당신은 configure 찾고 계십니까?

set :foo, "default value\n" # or explicitly set for each environment 
          # with different configure blocks 

configure :production do 
    set :foo, "production\n" 
end 

get '/test' do 
    settings.foo 
end 
+0

아니요 : YAML 파일에 이러한 구성을 원한다. – iconoclast

+0

@iconoclast [Sinatra :: ConfigFile] (http://www.sinatrarb.com/contrib/config_file.html) 또는 이와 유사한 것을 사용하고 있습니까? 'settings' 자체는 Yaml을 사용하지 않습니다. – matt

+0

예, 언급하는 것을 잊었습니다. 죄송합니다. – iconoclast

1

나는 이것이 당신이하는 일이라고 생각합니다.

Sinatra 앱 상단에 다음을 추가하십시오.

require 'sinatra/config_file' 
config_file './config/config.yml' # Point to wherever you want to store your config.yml 

# Within your config.yml specify per environment settings; very similar to Rails 
development: 
    database: sqlite://../bigtunadev.db 
    cipher: lamecipher4dev 
    oracle: 
    user: oracle_user 
    password: oracle_password 
    db2: 
    user: db2_user 
    password: db2_password 
    mysql: 
    user: mysql_user 
    password: mysql_password 

production: 
    database: sqlite://../bigtunaprod.db 
    cipher: [email protected]@w3s0m3c1p43r 

기본적으로 test, production, and development 환경 만 지원됩니다.

추가 환경을 추가하려면 다음과 같이 구성에서 환경을 대체해야합니다.

set :environments, %w{development test production staging} 

그러면 현재 환경의 설정에 대한 속성이 직접 노출됩니다.


추가 중첩을 추가 한 개발 섹션에서 유의하십시오.

다중 레벨 중첩은 해시로 액세스해야하므로 다음과 유사합니다.

settings.oracle["user"]

+0

예, 제가 준 예제에 대해 알아두면 좋지만, 계층 적 정보를 얻는 일반적인 방법을 원합니다. 예를 들어, 서로 다른 RDBMS에서 데이터를 가져 오는 Sinatra 기반 API를 상상해보십시오. 한 요청에서는 oracle.user 및 oracle.password가 필요하지만 다른 요청에서는 db2.user 및 db2.password가 필요할 수 있습니다. – iconoclast

+0

당신이하려는 일을 정확하게 이해한다면, 내가 준 원래 예제를 따라야하고 YAML 중첩을 확장 할 수 있어야합니다. 유일하게 이상한 점은 첫 번째 중첩 된 수준을 벗어나면 점 표기법을 사용하는 대신 해시로 액세스해야한다는 것입니다. 희망적으로 명확히하기 위해 위의 샘플에 몇 가지 추가 정보를 추가했습니다. 그게 아직도 당신이 찾고있는 것이 아니라면, 우리는 사적인 대화방에서 후속 조치를 취할 수 있습니다. 그래서 실이 지나치게 오래 가지 않습니다. – bigtunacan

+0

코드가 동적이어야하기 때문에'settings.oracle [ "user"]'을하고 싶지 않습니다. 'settings [ "database"] [ "user"]'와 같은 것이 필요합니다. – iconoclast

3

당신은 문자열을 사용하여 객체의 메소드를 호출 할 send를 사용할 수 있습니다.

get '/test' do 
    settings.send(settings.environment.to_s)['foo'] 
end 
관련 문제