Rails Builder::XmlMarkup для веб-службы - повторяющийся раздел

Я использую Builder для создания XML-сообщений, отправляемых на веб-сервис. Каждый из различных методов требует разного xml, но все они имеют набор общих элементов для запуска запроса (в основном, средства аутентификации учетной записи). Есть ли способ сделать это сухим способом? Вот мой код для построения запроса на изменение пароля:

# 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, являются общими для всех (или большинства) запросов. Сейчас я копирую один и тот же код снова и снова, но мне это совсем не нравится.

Какие-нибудь идеи по поводу сушки?

1 ответ

Как только я разместил это. У меня была идея, поставить первый набор в свой метод. 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

Работает отлично! Другой вариант, конечно, заключался бы в том, чтобы каким-то образом расширить Builder, но это приятно и просто.

Другие вопросы по тегам