将JBuilder视图渲染为HTML视图。

23

我用JBuilder创建了一个JSON视图。但我想将其预加载到数据对象中,这样Backbone就可以在不获取数据的情况下提前访问数据。

我该如何将list.json.jbuilder视图呈现到我的list.html.erb视图中?

通常没有使用JBuilder, 我会像这样做:

<div data-list="<%= @contents.to_json %>"></div>
1个回答

23

render 方法可以在视图中调用,返回传递的模板或局部模板的字符串渲染结果;你可以将该字符串嵌入到你想要的视图中。请注意:

  • 你必须在模板名称后面附加类型后缀/扩展名,否则 Rails 可能会混淆你调用的模板文件,例如:它可能会选择 list.html.erb 而不是 list.json.jbuilder。如果你在 list.html.erb 中进行此调用,则尝试渲染 list.html.erb 将导致无限递归和 SystemStackError 错误。使用 :format 选项似乎不起作用。
  • 你必须指定模板的限定路径,否则它不能找到正确的 "list.json" 模板,就算 list.json.jbuilderlist.html.erb 在同一个目录中。
  • 你需要通过 raw 传递 render 方法的输出结果,否则当它嵌入到视图中时会被转义。

因此,对于你的示例,假设模板位于 /app/views/foo 中,你可以编写以下代码:

<div data-list="<%= raw render(:template => "foo/list.json", :locals => { :contents => @contents }) %>"></div>

4
这真是一条实用技巧!谢谢。你也可以使用<%== %>代替raw - Mark G.
我被挑战使用jbuilder将html部分呈现为json属性。在这里,render也可以完成工作。json.prop render(:template => 'partials/_resort_summary', :locals => {resort: @resort}) - dc10
非常感谢。我花了相当长的时间来想出如何做到这一点。 - Ifelere Bolaji
很棒的回答@Craig Walker。我想补充一点,如果您想使用不以下划线开头的jBuilder文件,则需要包含单词“template”。阅读官方的Rails指南会给人留下这是可选的印象,但在这种情况下会有所不同:https://guides.rubyonrails.org/layouts_and_rendering.html#using-render(第2.2.2节)。因此,在Rails 5.2中可以使用<%= raw render template: "foo/list.json.jbuilder" %> - MSC
@CraigWalker - 已经过去了一些年头,但或许值得问一下:调用“raw”用户输入的JSON是否安全?使用“h”代替是否是不可接受的提议? - BenKoshy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接