2010-10-13 48 views
0

我使用Builder來構建發送到WebService的XML消息。每種不同的方法都需要不同的xml,但它們都有一組通用的元素來開始請求(主要是賬戶認證的東西)。有沒有辦法以乾的方式做到這一點?這是我的用於構造變化通行短語請求代碼:Rails Builder :: Web服務的XmlMarkup - 重複部分

# XML REQUEST SETUP 
msg = Builder::XmlMarkup.new(:indent=>2) 
query = {} 
test_hsh = self.testmode ? {:Test => "YES"} : {} 

# BUILD THE REQUEST 
query[:changePassPhraseRequestXML] = msg.ChangePassPhraseRequest(test_hsh) do |asr| 
    asr.RequesterID APP_CONFIG[:endicia_partner_id].to_s 
    asr.RequestID "1" 
    asr.CertifiedIntermediary do |ci| 
    ci.AccountID APP_CONFIG[:endicia_account_number].to_s 
    ci.PassPhrase APP_CONFIG[:endicia_passphrase].to_s 
    end 
    asr.NewPassPhrase APP_CONFIG[:passphrase].to_s 
end 

基本上除了NewPassPhrase一個所有元件是通用的所有(或大部分)的請求。現在我反覆複製相同的代碼,但我根本不喜歡這個。

任何想法乾涸?

回答

0

只要我發佈這個。我有一個想法,把第一套放到他們自己的方法中。咄!

def account_status(options = {}) 
    # XML REQUEST SETUP 
    msg = Builder::XmlMarkup.new(:indent=>2) 
    query = {} 
    test_hsh = self.testmode ? {:Test => "YES"} : {} 

    # BUILD THE REQUEST 
    query[:changePassPhraseRequestXML] = msg.ChangePassPhraseRequest(test_hsh) do |asr| 
    self.add_authentication_elements(asr) 
    asr.NewPassPhrase APP_CONFIG[:new_pass_phrase].to_s 
    end 
end 

def add_authentication_elements(parent_node) 
    parent_node.RequesterID self.endicia_partner_id.to_s 
    parent_node.RequestID "1" 
    parent_node.CertifiedIntermediary do |ci| 
    ci.AccountID self.endicia_account_number.to_s 
    ci.PassPhrase self.endicia_passphrase.to_s 
    end 
end 

很好用!另一種選擇當然是以某種方式擴展Builder,但這非常簡單。