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

Generate XML Request Payload with Template in Rails

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

我目前正在使用 Faraday 来处理请求。我有一个看起来像这样的 class:

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 实际上比那个更大更复杂,所以我不想在这个 class 中构建 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方法不够健壮,无法满足我的需求(我需要标签属性,我不想表示一个很深的复杂XML 具有 ruby 散列的树)。

我做过类似的事情,我发现最简单的方法是将我需要的任何 XML 类 实现到一个单独的 gem 中(你真的不必为此,您只需在模型文件夹中的某处添加 类,这对我的用例很有意义。

我为此使用了ROXML;之后您可以简单地调用 root.to_xml.to_s 来呈现您的字符串,请参阅 github 上的示例,这非常简单。