Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails Builder::XmlMarkup for Web服务-重复部分_Ruby On Rails_Xml_Dry_Xml Builder - Fatal编程技术网

Ruby on rails Rails Builder::XmlMarkup for Web服务-重复部分

Ruby on rails Rails Builder::XmlMarkup for Web服务-重复部分,ruby-on-rails,xml,dry,xml-builder,Ruby On Rails,Xml,Dry,Xml Builder,我正在使用Builder构造发送到Web服务的XML消息。每个不同的方法都需要不同的xml,但它们都有一组公共元素来启动请求(主要是帐户身份验证)。有没有什么办法可以用干燥的方式做?以下是我构建更改通行证短语请求的代码: # XML REQUEST SETUP msg = Builder::XmlMarkup.new(:indent=>2) query = {} test_hsh = self.testmode ? {:Test => "YES"} : {} # BUILD THE

我正在使用Builder构造发送到Web服务的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 one之外的所有元素对于所有(或大多数)请求都是通用的。现在我一遍又一遍地复制相同的代码,但我一点也不喜欢这样


有没有关于把它晾干的想法?

我一贴出来就知道了。我有一个想法,把第一套变成自己的方法。哼

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
很好!当然,另一个选择是以某种方式扩展生成器,但这很好,也很简单