0

我正在尝试在博客文章下呈现评论。简单的身份验证确保只有我可以看到破坏链接。

问题是这样的:即使评论为零,也会呈现一个额外的销毁链接,该链接重定向到不存在的posts/:post_id/comments。只有 :create 和 :destroy 资源存在。

个别评论的销毁链接得到正确呈现和行为正确,即发送删除请求到posts/:post_id/:id。

我的代码:

<!-- views/posts/show.html.erb -->

<% provide(:title, @post.title) %>

<%= render "show_listing", :post => @post %>

<% if admin? %>
  <p><%= link_to "Edit", edit_post_path(@post) %></p>
  <p><%= link_to "Destroy", post_path(@post), :confirm => "Zeker weten?", :method => :delete %></p>
<% end %>

<p><%= link_to "Terug naar blog", blog_path %></p>

<h2>Laat een reactie achter:</h2>
<%= form_for([@post, @post.comments.build]) do |f| %>
  <p>
    <%= f.label :author, "Naam" %><br>
    <%= f.text_field :author %>
  </p>
  <p>
    <%= f.label :body, "Bericht" %><br>
    <%= f.text_area :body %>
  </p>
  <p>
    <%= f.submit "Verzend" %>
  </p>
<% end %>

<h2>Reacties</h2>
<% @post.comments.each do |comment| %>
  <p><%= comment.author %></p>
  <p><%= comment.body %></p>
  <% if admin? %>
    <p>
      <%= link_to 'Destroy Comment', post_comment_path(@post, comment),
               method: :delete,
               confirm: 'Are you sure?' %>
    </p>
  <% end %>
<% end %>

这是正在生成的 html。.each 块中的代码会被执行,即使注释为零。

<p></p>
<p></p>
  <p>
    <a data-confirm="Are you sure?" data-method="delete" href="/posts/16/comments/" rel="nofollow">Destroy Comment</a>
  </p>

更新:这很奇怪。当我在 Rails 控制台中尝试时:

post = Post.find(16)
post.comments.empty? # => true

但是当将我的块包含在一个除非语句中时:

<% unless @post.comments.empty? %>
  ...
<% end %>

代码仍然被执行!更改为 if @post.comments.empty? 它什么也没显示。(没有破坏链接)。

更新:在 rake db:reset 和服务器重置后,没有变化。推杆

<%= debug comment %>

块内返回:

--- !ruby/object:Comment
attributes:
  id: 
  author: 
  body: 
  post_id: 1
  created_at: 
  updated_at: 

因此,每个帖子都有一个幻影评论。这是怎么来的?

4

1 回答 1

1

问题在于您的表单声明@post.comments.build. 这是对 进行新的(但尚未保存)评论@post,因此当涉及到您的循环时,测试@post.comments.empty?确实通过了,因为您刚刚为集合添加了新评论。

也可能只是一种风格的东西,但我发现这种行为.blank?.empty?

于 2013-11-12T18:15:00.453 回答