我正在开发一个与后端第三方集成的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树)。
答案 0 :(得分:1)
我做了类似的事情,我找到的最简单的方法是将我需要的任何XML类实现到一个单独的gem中(你真的不必这样做,你可以在某处添加类) models文件夹,它对我的用例很有意义。)
我为此使用了ROXML;之后你可以简单地调用root.to_xml.to_s
来渲染你的字符串,看看github上的例子,它真的很简单。