0

我的视图代码中有这个:

<h2>What Others Are Saying...</h2>

<% @comments.each do |comment| %>
<ul>
    <li><%= comment.email %></li>
    <li><%= comment.body %></li>
</ul>
<% end %>

<hr>
<%= render "comments/comment_form" %>

控制器代码:

  before_filter :authenticate_user!, except: [:index, :show]

  def index
    @posts = Post.all
  end

  def show
    @post = Post.find(params[:id])
    @comment = @post.comments.build
    @comments = @post.comments
  end

当没有评论时,我仍然在我的 DOM 中看到 ul > li,有没有办法在 soemone 实际发布消息之前不渲染它?

4

4 回答 4

2

您的@comments变量不为空。当数据库返回零评论时,@comments数组中仍然有一个新的评论实例。这就是您的 HTML 代码在您看不到任何评论的情况下被渲染的原因。您可以使用以下代码

<% @comments.each do |comment| %>
  <% if comment.id? %>
    <ul>
      <li><%= comment.email %></li>
      <li><%= comment.body %></li>
    </ul>
  <% end %>
<% end %>

更新

@comment = @post.comments.build
# When you do @post.comments after building in the above line,
# your @comments will have the built comment as well.
@comments = @post.comments
于 2012-08-16T16:19:09.253 回答
1

我最初误解了您的问题,并认为您想要一个<ul></ul>包装所有评论,并避免<ul></ul>在没有评论时出现空白。在这种情况下,一个简单的if块就足够了:

<h2>What Others Are Saying...</h2>

<% if ! @comments.empty? %>
    <ul>
    <% @comments.each do |comment| %>
         <li><%= comment.email %></li>
         <li><%= comment.body %></li>
    <% end %>
    </ul>
<% end %>

但正如其他人所指出的,这个问题实际上是由于您@post.comments.build在分配之前使用了@comments. 我不确定你为什么这样做build,但如果你在分配之后这样做那么@comments它可能会消失。

于 2012-08-16T16:13:55.627 回答
1

如果 @comments 是一个空数组,则循环中的任何内容都不应呈现。检查@comments 是否真的为空

<%= @comments.size %>

控制器不应调用 build

  def show
    @post = Post.find(params[:id])
    @comments = @post.comments
  end
于 2012-08-16T16:15:23.703 回答
0

奇怪的是,如果@comments实例变量为空,则each不应渲染块内的任何内容。

如果@comments通过另一个模型(@blog.comments或其他东西)引用,您确定您没有在控制器(例如@blog.comments.build)中为 comment_form 构建“空白”注释吗?

如果您可以向我们展示控制器操作以及视图的其余部分,它可能会变得清晰。

要调试,您还可以将此行放在each块之前:

<%= @comments.inspect %>

这应该告诉你@comments变量是否真的为空。

于 2012-08-16T16:16:11.857 回答