在 html 视图中呈现 JBuilder 视图
Posted
技术标签:
【中文标题】在 html 视图中呈现 JBuilder 视图【英文标题】:Render a JBuilder view in html view 【发布时间】:2013-01-05 18:05:33 【问题描述】:我用 JBuilder 创建了一个 json 视图。但是我想将它预加载到一个数据对象中,这样 Backbone 就可以在早期访问数据而无需获取它。
如何将 list.json.jbuilder 视图呈现到我的 list.html.erb 视图中?
通常没有 jbuilder,我会这样做:
<div data-list="<%= @contents.to_json %>"></div>
【问题讨论】:
【参考方案1】:render
,当从视图中调用时,返回传递的模板或部分的字符串渲染;您可以根据需要将该字符串嵌入到您的视图中。请注意:
list.html.erb
而不是list.json.jbuilder
。如果您正在从 list.html.erb
进行此调用,尝试渲染list.html.erb
会导致无限递归和SystemStackError。对render
使用:format
选项似乎不起作用。
您必须指定模板的限定路径;它不会为“list.json”找到正确的模板,因为list.json.jbuilder
与list.html.erb
位于同一目录中。
您需要通过raw
传递render
调用的输出;否则,当它嵌入到视图中时,它会被转义。
因此,对于您的示例,假设您的模板位于 /app/views/foo
:
<div data-list="<%= raw render(:template => "foo/list.json", :locals => :contents => @contents ) %>"></div>
【讨论】:
这真是个小窍门!谢谢。你也可以用<%== %>
代替raw
我被要求使用 jbuilder 将 html 部分呈现为 json 属性。 render 在这里也可以完成工作 json.prop render(:template => 'partials/_resort_summary', :locals => resort: @resort)
非常感谢。我花了相当长的时间来弄清楚我会如何做到这一点。
很好的答案@Craig Walker。我想补充一点,如果要使用不以下划线开头的 jBuilder 文件,则需要包含单词 template
。阅读官方 Rails Guides 会让人觉得这是可选的,但在这种情况下会有所不同:guides.rubyonrails.org/layouts_and_rendering.html#using-render(第 2.2.2 节)。所以<%= raw render template: "foo/list.json.jbuilder" %>
在 Rails 5.2 中工作。以上是关于在 html 视图中呈现 JBuilder 视图的主要内容,如果未能解决你的问题,请参考以下文章
Rails jbuilder DateTime将小数添加到秒