0

Builder を使用して、WebService に送信される XML メッセージを作成しています。さまざまなメソッドごとに異なる xml が必要ですが、すべてのメソッドには、要求を開始するための一連の共通要素 (主にアカウント認証のもの) があります。DRYの方法でそれを行う方法はありますか? パスフレーズ変更リクエストを作成するための私のコードは次のとおりです。

# 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 以外のすべての要素は、すべての (またはほとんどの) 要求に共通です。現在、同じコードを何度もコピーしていますが、これはまったく好きではありません。

それを乾かすことについてのアイデアはありますか?

4

1 に答える 1

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 を拡張することですが、これは素晴らしく簡単です。

于 2010-10-13T15:00:24.323 に答える