如何在使用render_to_string后正常渲染视图?

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.

例如:

  • Rails找不到默认视图,show.html.erb因为它查找了一个show.rxml.
  • 简单地将一个render 'mycontroller/show.html.erb'放在我的动作处理程序的底部使Rails找到模板,但浏览器不起作用,因为响应头的内容类型是text/xml.

有没有办法使用render_to_string而不"污染"实际的浏览器响应?

编辑:似乎在Rails 2中erase_render_results可以做到这一点,但在Rails 3中它已不再可用.

Dan*_*ail 2

务实的答案是,使用视图文件和两次渲染调用不是 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 流。根据您向其他服务器发送内容的方式,您可以很好地将其全部包装起来。

当然,这可能会变得非常混乱和冗长,这就是为什么您希望将这一功能封装在另一个类中,或者作为模型中的方法。