【问题标题】:Why render_to_string messes up the page?为什么 render_to_string 会弄乱页面?
【发布时间】:2014-02-11 20:44:04
【问题描述】:

我有一个控制器,它从数据库中获取一些数据,并且在我的浏览器中很好地呈现了一个 html 视图。

现在我需要在我的 html 中引导一些 json(供 javascript 使用)。

我添加以下代码在控制器中渲染 json:

@my_json = render_to_string(template: 'dimension_types/index.json.jbuilder')

我什么也不做,只需将这段代码添加到我的控制器中,现在浏览器只会显示我页面的 html 代码。 在 html 源代码中,我的页面包含在 <pre></pre> 标记中.

日志中没有错误。我尝试添加 layout: false,传递处理程序和格式的各种组合来渲染 - 没有任何变化。

我做错了什么?我缺少文档的哪一部分?

【问题讨论】:

  • 是否打算呈现 JSON 而不是 HTML?可能视图处理默认为 HTML,而不是 JSON
  • 成功找到模板。正如我所说,我尝试了格式: :jbuilder 等。
  • 该代码不会为您呈现 JSON,它会将您的 JSON 模板呈现为实例变量,然后呈现常规 HTML 或它可以找到的任何模板。您应该有一个 JSON 类型的动作模板,或者在动作中渲染 :json => ...。
  • 这正是我想做的:将 json 渲染成一个变量
  • 应该可以,那么您在控制器中还做了什么?

标签: ruby-on-rails json ruby-on-rails-4


【解决方案1】:

我也遇到过这个问题。可能有更好的方法来做到这一点,但这里有一个可行的半破解方法:

# the_controller.rb
def your_action
  #...
  @json_string = render_to_string(template: 'a_template', formats: [:json])
  # reset the content type header
  response.headers["Content-Type"] = 'text/html'
  #...
end

下一段代码展示了我如何在我的视图中使用 JSON 字符串。如果 JSON 包含用户生成的数据,您需要对其进行更彻底的清理以防止 XSS 安全风险(更多信息:https://stackoverflow.com/a/10390313/111635)。我生成的JSON没有这个问题,所以我就用html_safe

# the_view.html.erb
# ... bunch of ERB code ...
<%= javascript_tag do %>
  $(document).ready(function() {
    do_stuff_with_json(<%= @json_string.html_safe %>);
  });
<% end %>

【讨论】:

    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多