Пустой div отображается с ruby ​​.each enumerable на странице HTML.erb.

Кажется, я не могу понять, почему мой ruby ​​.each enumerable производит пустой div, если мой массив объектов пуст, или добавляет пустой div внизу, если в моем Переменная @posts.

Вот моя страница index.html.erb:

<div id="post_feed">
<%if @posts.any?%>
  <%@posts.each do |p|%>
    <div class="post_text_box">
      <%=p.body%>
    </div>
  <%end%>
<%end%>
</div>

Пост-контролер:

def index
    @posts = current_user.posts
    @new_post = current_user.posts.new 
  end

CSS:

#post_feed{
  margin-right:auto; 
  margin-left:auto; 
  width:400px; 
}

.post_text_box{
  padding:10px;
  margin:10px;
  background-color:#FFFFFF;
}

рельсы консоли показывает 1 шт.

irb(main):014:0> Post.count
   (1.3ms)  SELECT COUNT(*) FROM "posts"
=> 1

Вот изображение пустого div.


person user1730335    schedule 15.04.2016    source источник


Ответы (2)


Несмотря на то, что он еще не был сохранен, Rails рассматривает @new_post как часть current_user.posts, поэтому у вас есть пустая запись в конце вашего @posts списка.

Он не появляется в запросе к базе данных, потому что не был сохранен.

В зависимости от того, что вам нужно сделать, вы можете сделать @new_post просто пустым сообщением (@new_post = Post.new) и назначить пользователя при сохранении.

Или в вашем each цикле вы можете проверить, есть ли у сообщения тело, прежде чем создавать div, если вы можете положиться на эту проверку, чтобы дать вам желаемые результаты:

<div id="post_feed">
  <%@posts.each do |p|%>
    <% if p.body %>
       <div class="post_text_box">
         <%=p.body%>
        </div>
     <%end%>
   <%end%>
 </div>

Вам не нужна if @posts.any? проверка, так как она всегда будет оцениваться как true из-за нового сообщения, созданного с помощью @new_post = current_user.posts.new.

И, как правило, в Ruby вам не нужно проверять, пуст ли массив перед запуском цикла each, потому что цикл each ничего не сделает (или не выдаст ошибку) с пустым массивом.

person Joseph    schedule 15.04.2016
comment
Спасибо, Джозеф. Ваш путь намного чище, чем тот беспорядок, который я сотворил. - person user1730335; 15.04.2016

Я понял. В своем контроллере я создаю новый объект, но не сохраняю его. Мой итератор .each распознает его как объект в моем массиве объектов @posts, даже если он не сохранен.

Я исправил это, проверив, была ли запись новой, с помощью метода new_record?.

<div id="post_feed">
<%if @posts.any?%>
  <%@posts.each do |p|%>
   <%if ! p.new_record?%>
    <div class="post_text_box">
      <%=p.body%>
    </div>
    <%end%>
  <%end%>
<%end%>
</div>
person user1730335    schedule 15.04.2016