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

1

<ul></ul>私はもともとあなたの質問を誤解していて、すべてのコメントを1つにまとめて、コメントがないときに空にならないようにしたいと思っていました<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 %>

コントローラーはビルドを呼び出すべきではありません

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

奇妙なことに、@commentsインスタンス変数が空の場合、eachブロック内には何も表示されません。

@commentsが別のモデル (または何か) を介して参照されている場合、comment_form@blog.commentsのコントローラー (例: ) に「空白の」コメントを作成していませんか?@blog.comments.build

コントローラーのアクションと、おそらくビューの残りの部分を見せていただければ、それが明確になるかもしれません。

デバッグするには、eachブロックの前に次の行を配置することもできます。

<%= @comments.inspect %>

@comments変数が本当に空かどうかが表示されます。

于 2012-08-16T16:16:11.857 に答える