2012-03-08 42 views
0

在我的initialize方法中,我試圖編寫它,以便我可以傳遞哈希或yaml對象來初始化屬性值。從yaml或hash初始化屬性的安全方法

我YAML文件看起來像:

defaults: &defaults 
    host: localhost 
    port: 4565 
    timeout: 3 


development: 
    <<: *defaults 

test: 
    <<: *defaults 

staging: 
    <<: *defaults 

production: 
    <<: *defaults 

目前,我有這樣的:

def initialize(options) 

    if options.respond_to? "has_key" && options.has_key? "defaults" 
    config = options["defaults"] 
    else 
    config = options 
    end 

    @hostname = config[:hostname] 
    @port = config[:port] 
    @timeout = config[:timeout] 

end 

這是目前不適合我的工作,我得到這個錯誤:

unexpected tSTRING_BEG, expecting keyword_then or ';' or '\n' 
     if options.respond_to? "has_key" && options.has_key? "defaults" 
  1. 我怎樣才能加載正確的環境呢? (測試,開發,生產)
  2. 如果其中一個鍵不存在,我該如何拋出一個錯誤? (或至少說主要的,我需要肯定像主機名,端口)

回答

2

你需要給你的if語句加上括號。

if options.respond_to?("has_key") && options.has_key?("defaults") 
+0

空間似乎也很重要?困惑,沒想到這個! – Blankman 2012-03-08 18:55:12

0

爲什麼你有以下代碼?

if options.respond_to? "has_key" && options.has_key? "defaults" 
    config = options["defaults"] 
    else 
    config = options 
    end 

YAML的文件是在所有四組(開發,測試,運行,生產)將有默認鍵的方式構成,他們將不會被下default關鍵嵌套。它基本上相當於這個:

development: 
    host: localhost 
    port: 4565 
    timeout: 3 

test: 
    host: localhost 
    port: 4565 
    timeout: 3 

#... 
+0

雖然我看到了默認。 – Blankman 2012-03-08 21:31:44

+0

我想你是通過yaml [:開發]作爲選項,將不會有:默認密鑰在該散列。 – 2012-03-09 00:50:10