【问题标题】:Generate XML Request Payload with Template in Rails在 Rails 中使用模板生成 XML 请求负载
【发布时间】:2016-08-31 20:36:14
【问题描述】:

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

我目前正在使用 Faraday 来执行请求。我有一个看起来像这样的类:

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 树)。

【问题讨论】:

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


    【解决方案1】:

    我做过类似的事情,我发现最简单的方法是将我需要的任何 XML 类实现到一个单独的 gem 中(你实际上不必这样做,你可以将类添加到模型文件夹中的某个位置,这对我的用例很有意义)。

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

    【讨论】:

    • 我有点犹豫是否要为需要呈现的 XML 中的每个标记创建一个类,但代码最终看起来非常棒。谢谢
    猜你喜欢
    • 2016-08-24
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多