Dan*_*ski 5 ruby-on-rails ruby-on-rails-3
在我的Rails应用程序中,我有一个使用XML Builder template(rxml)模板创建XML文档的操作render_to_string.XML文档被转发到后端服务器.
创建XML文档后,我想向浏览器发送一个普通的HTML响应,但不知何故Rails正在记住第一次调用render_to_string.
例如:
show.html.erb因为它查找了一个show.rxml.render 'mycontroller/show.html.erb'放在我的动作处理程序的底部使Rails找到模板,但浏览器不起作用,因为响应头的内容类型是text/xml.有没有办法使用render_to_string而不"污染"实际的浏览器响应?
编辑:似乎在Rails 2中erase_render_results可以做到这一点,但在Rails 3中它已不再可用.
务实的答案是,使用视图文件和两次渲染调用不是 Rails 方式:视图通常是发送到客户端的东西,而 ActionPack 被设计为以这种方式工作。
也就是说,有一种简单的方法可以实现您想要做的事情。您可以直接使用 Builder::XmlMarkup 将 XML 生成为字符串,而不是使用 ActionView:
def action_in_controller
buffer = ""
xml = Builder::XmlMarkup.new(buffer)
# build your XML - essentially copy your view.xml.builder file here
xml.element("value")
xml.element("value")
# send the contents of buffer to your 3rd server
# allow your controller to render your view normally
end
Run Code Online (Sandbox Code Playgroud)
查看Builder 文档以了解其工作原理。
您可以利用的 Builder 的另一个功能是 XML 内容使用 附加到缓冲区<<,因此可以使用任何 IO 流。根据您向其他服务器发送内容的方式,您可以很好地将其全部包装起来。
当然,这可能会变得非常混乱和冗长,这就是为什么您希望将这一功能封装在另一个类中,或者作为模型中的方法。