Rails视图中多态评论对象代码被输出,如何解决?
解决Rails多态评论视图输出对象原始代码的问题
Hey Darrell, sorry to hear you're stuck on this—polymorphic associations can be tricky enough without weird view rendering issues popping up! Let me walk you through the most common culprit here first, since it’s super easy to miss.
最可能的原因:循环时误用<%=代替<%
在Rails的ERB视图里,<%=会把代码的返回值输出到页面上,而<%只是执行代码不输出。如果你的评论循环代码是这样的:
<%= @comments.each do |comment| %> <div class="comment"> <p><%= comment.body %></p> <!-- 其他评论相关内容 --> </div> <% end %>
这里的@comments.each会返回整个评论数组,<%=就会把这个数组的inspect结果(也就是你看到的“原始代码”,类似#<Comment id: 1, body: "...", ...>)输出在所有评论的下方。
修复方法:把循环开头的<%=改成<%:
<% @comments.each do |comment| %> <div class="comment"> <p><%= comment.body %></p> <!-- 其他评论相关内容 --> </div> <% end %>
其他可能的排查方向
如果上面的方法没解决问题,再检查这几点:
- 局部模板里的误输出:如果你用了局部模板渲染单条评论(比如
<%= render comment %>),检查局部模板(比如app/views/comments/_comment.html.erb)里有没有直接写<%= comment %>的代码,这会直接输出评论对象的inspect内容,改成只渲染需要的属性(比如<%= comment.body %>)。 - 重复渲染输出:确认有没有在视图里多次调用渲染评论的代码,或者不小心在某个地方额外输出了
@comments变量。 - 查看页面源码:打开Chromium的开发者工具(F12),查看页面的HTML源码,找到那个“原始代码”对应的部分,看它在DOM中的位置,能帮你快速定位到是哪段视图代码导致的输出。
既然你用的是Rails 5.1.4,这些ERB的行为逻辑和标准Rails版本一致,上面的排查方向应该能帮你解决问题!
内容的提问来源于stack exchange,提问作者Darrell Mayson
相关产品推荐
相关产品推荐

