在 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,当从视图中调用时,返回传递的模板或部分的字符串渲染;您可以根据需要将该字符串嵌入到您的视图中。请注意:

您必须在模板名称后面加上类型后缀/扩展名。如果你不这样做,Rails 可能会对你调用的模板文件感到困惑;即:它可能会选择list.html.erb 而不是list.json.jbuilder。如果您正在 list.html.erb 进行此调用,尝试渲染list.html.erb 会导致无限递归和SystemStackError。对render 使用: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>

【讨论】:

这真是个小窍门!谢谢。你也可以用&lt;%== %&gt;代替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 节)。所以&lt;%= raw render template: "foo/list.json.jbuilder" %&gt; 在 Rails 5.2 中工作。

以上是关于在 html 视图中呈现 JBuilder 视图的主要内容,如果未能解决你的问题,请参考以下文章

Rails jbuilder DateTime将小数添加到秒

使用 Jbuilder(或其他)的 Rails JSON API 布局

j渲染视图后Javascript不起作用

如何在MvvmCross中呈现iOS模态视图

在视图 html 中呈现 ionic3 数据

如何通过布尔值在播放视图模板中呈现不同的 html 元素?