在我的 Rails 应用程序中,我有一个使用 XML Builder 模板( rxml
)模板和 render_to_string
创建 XML 文档的操作。 . XML 文档被转发到后端服务器。
创建 XML 文档后,我想向浏览器发送一个普通的 HTML 响应,但不知何故,Rails 记住了对 render_to_string
的第一次调用。 .
例如:
show.html.erb
因为它寻找一个 show.rxml
. render 'mycontroller/show.html.erb'
在我的操作处理程序底部,Rails 找到模板,但浏览器无法工作,因为响应 header 的内容类型是 text/xml
. 有什么办法可以使用
render_to_string
没有“污染”实际的浏览器响应?编辑:似乎在 Rails 2
erase_render_results
中可以解决问题,但在 Rails 3 中它不再可用。
最佳答案
似乎这可能是 rails 3 中的一个错误(至少与 2.3.x render_to_string 的行为相比)。在 source for 2.3.8他们显然采取了额外的步骤来重置 content_type 并将响应正文设置为 nil (除其他外)。
def render_to_string
...
ensure
response.content_type = nil
erase_render_results
reset_variables_added_to_assigns
end
但在 AbstractController::Rendering 的 3.0.3 源中
def render_to_string(*args, &block)
options = _normalize_args(*args, &block)
_normalize_options(options)
render_to_body(options)
end
您可以看到没有显式重置变量,render_to_body 只返回 view_context.render。 content-type、response_body 等可能在其他地方处理,这是一个红鲱鱼,但我的第一直觉是设置
response.headers['Content-Type'] = 'text/html'
在您的
render_to_string
之后在实际渲染之前。
关于ruby-on-rails - 使用render_to_string后如何正常渲染 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4684486/