Rails渲染集合嵌套局部视图。

4

我正在尝试使用Rails渲染集合。如果按照Rails指南关于该主题的部分所述的步骤进行,这看起来是一个简单的操作。

局部视图在渲染集合时非常有用。当您通过:collection选项将集合传递给局部视图时,该局部视图将为集合中的每个成员插入一次:

因此,按照这个建议,我声明:

<%= render partial: "comments/comment", collection: @post.comments %>

在局部视图views/comments/_comment.html.erb中,我只有以下内容。
<div="comment_wrapper">
<p class="comment_name"><%= comment.name %></p>
<p class="comment_date"><%= comment.created_at %></p>
<p class="comment_body"><%= comment.body %></p>
</div>

现在这些部分都会相互嵌套。假设我有两个评论,它将呈现如下:
<div="comment_wrapper">
<p class="comment_name"><%= comment.name %></p>
<p class="comment_date"><%= comment.created_at %></p>
<p class="comment_body"><%= comment.body %></p>
     <div="comment_wrapper">
     <p class="comment_name"><%= comment.name %></p>
     <p class="comment_date"><%= comment.created_at %></p>
     <p class="comment_body"><%= comment.body %></p>
     </div>
</div>

有人明白这是为什么吗?如何防止它发生?提前感谢。


3
可能应该改为:
- jbhannah
天啊,我一直坐在这里手抓头发,不理解这种奇怪的行为。谢谢你帮我解决这个愚蠢的错误。我一遍又一遍地忽略了它... - sjbuysse
1个回答

4

实际上,它们并不会。

这只是您的浏览器试图理解无效的HTML以构建可显示的DOM。

<div="comment_wrapper">

这不是有效的。标签有属性,可以为它们分配值。我猜这是关于CSS的(所以属性要么是id,要么是class),在页面上显然有多个这样的出现(这只留下了class):

<div class="comment_wrapper">

另外...

如果你在编写纯 HTML 时遇到困难,你可以转而使用一些模板语言,比如SlimHaml。这些语言通常会在无效的代码上产生错误或者产生出乎意料的结果,使错误变得显而易见。然而,了解基础语言(HTML)有助于自信地构建标记。除此之外,天啊,这又是一门完全不同的语言!以下是在 Slim 中呈现 partial 的示例:

.comment_wrapper
  p.comment_name= comment.name
  p.comment_date= comment.created_at
  p.comment_body= comment.body

考虑一下这个问题,如果对你来说太难了,可以继续使用ERB。

对不起,我打错了一次又一次地忽略了它... 我相信这种情况发生在我们中的佼佼者身上,而我只是我们中的普通人 ;) - sjbuysse
@sjbuysse 没问题。我刚刚有机会调试了一个类似的情况。不要相信你的浏览器,它可能收到了完全不同的东西 :) - D-side

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