使用Rails中的模板生成XML请求有效负载

时间:2016-08-31 20:36:15

标签: ruby-on-rails ruby xml templates faraday

我正在开发一个与后端第三方集成的rails应用程序。为了快速概述,用户将在我们的Web界面中创建一个订单,这将保留延迟的作业。因此,作业在Web上下文之外运行,并将向第三方发送请求。第三方期望在请求正文中使用带有XML有效负载的POST。

我目前正在使用法拉第来做这个请求。我有一个看起来像这样的课程:

class FooRequest
  def response
    connection.post("/foo", xml)
  end

  private

  def xml
    xml = Builder::XmlMarkup.new
    xml.root do
      xml.foo "something something"
    end

    xml.target!
  end      

  def connection
    @connection ||= Faraday.new(url: "http://example.org")
  end
end

XML实际上更大,更复杂,所以我不想在这个类中构建xml。我认为拥有某种模板是最好的。我要么在xml.builder文件中使用Builder,要么在erb文件中使用原始XML。不确定哪个最好,以及如何最好地在此上下文中呈现模板。我知道rails最近添加了在控制器上下文之外呈现视图的能力(https://medium.com/evil-martians/new-feature-in-rails-5-render-views-outside-of-actions-2fc1181e86a8#.s344qg5ue),但我觉得这个功能不是为这个用例构建的。我也知道还有其他模板语言,比如Liquid,也许这更适合。

过去有没有人做过这种事情?有什么我想念的吗? 另外,如果我创建了一个模板文件,我应该将它放在/app/views中吗?这不是我的webapp会呈现的视图,也许我应该有一个/app/templates目录?

PS:Rails的to_xml方法对我想要的东西不够健壮(我需要标记属性,我不想用ruby哈希表示深度复杂的XML树)。

1 个答案:

答案 0 :(得分:1)

我做了类似的事情,我找到的最简单的方法是将我需要的任何XML类实现到一个单独的gem中(你真的不必这样做,你可以在某处添加类) models文件夹,它对我的​​用例很有意义。)

我为此使用了ROXML;之后你可以简单地调用root.to_xml.to_s来渲染你的字符串,看看github上的例子,它真的很简单。