Дополнительная ссылка уничтожения после итерации по @post.comments в Rails 4

Я пытаюсь сделать комментарии под сообщением в блоге. Простая аутентификация гарантирует, что только я вижу ссылки уничтожения.

Проблема заключается в следующем: дополнительная ссылка уничтожения отображается даже при нулевых комментариях, которая перенаправляет на 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>

Обновление: это очень странно. Когда я пытаюсь в рельсах консоли:

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

Но при заключении моего блока в оператор

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

Код все еще выполняется!! Изменить на if @post.comments.empty? и это ничего не показывает. (не уничтожать ссылку).

Обновление: после граблей БД: сброс и сброс сервера, без изменений. Ввод

<%= debug comment %>

внутри блока возвращает это:

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

Так что с каждым постом связан один фантомный комментарий. Как это сюда попало?

1 ответ

Решение

Проблема в том, что ваша форма декларируется @post.comments.build, Это делает новый (но еще не сохраненный) комментарий к @post, так что когда дело доходит до вашего цикла, тест @post.comments.empty? проходит, потому что вы только что сделали новый комментарий к коллекции.

Также возможно просто вещь стиля, но я нахожу поведение .blank? гораздо более привлекательным, чем .empty?

Другие вопросы по тегам