2010-10-13 10 views
0

J'utilise Builder pour construire des messages XML envoyés à un WebService. Chacune des différentes méthodes nécessite un xml différent mais elles ont toutes un ensemble d'éléments communs pour démarrer la requête (principalement des éléments d'authentification de compte). Y a-t-il un moyen de le faire de manière DRY? Voici mon code pour la construction d'une demande de changement de mot de passe:Rails Builder :: XmlMarkup pour le service Web - Section répétitive

# 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 

Fondamentalement, tous les éléments sauf l'NewPassPhrase un sont communs à toutes les demandes (ou la plupart). En ce moment, je copie le même code encore et encore, mais je n'aime pas du tout cela.

Des idées sur le séchage?

Répondre

0

Dès que j'ai posté ceci. J'ai eu une idée, mettre le premier ensemble dans leur propre méthode. Duh!

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 

Fonctionne bien! Une autre option serait bien sûr d'étendre Builder d'une manière ou d'une autre, mais c'est simple et agréable.