我正在尝试在博文中发表评论。简单的身份验证确保只有我可以看到destroy链接。
问题是:即使没有评论,也会呈现额外的销毁链接,重定向到帖子/:post_id / comments,这不存在。只存在:create和:destroy资源。
各个评论的销毁链接得到正确呈现并且行为正确,即向帖子发送删除请求/: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 console中尝试时:
post = Post.find(16)
post.comments.empty? # => true
但是在我的块中包含一个除非声明:
<% unless @post.comments.empty? %>
...
<% end %>
代码仍然执行!!更改为if @ post.comments.empty?它没有显示任何东西。 (没有销毁链接)。
更新:在rake db:reset和server reset之后,没有更改。把
<%= debug comment %>
块内的返回:
--- !ruby/object:Comment
attributes:
id:
author:
body:
post_id: 1
created_at:
updated_at:
所以每个帖子都有一个幻影评论。这是怎么来的?
答案 0 :(得分:1)
问题在于您的表单声明@post.comments.build
。这是在@post
上发表一个新的(但尚未保存的)评论,因此当涉及到你的循环时,测试@post.comments.empty?
确实会通过,因为你只是为该集合做了一个新评论。
也许只是一种风格的东西,但我发现.blank?
的行为比.empty?