在HTML.erb页面上,可以使用ruby .each枚举空div。

时间:2016-04-15 00:33:23

标签: html ruby-on-rails ruby-on-rails-4 each enumerable

我似乎无法弄清楚为什么我的红宝石 .each 可枚举如果我的对象数组为空,则生成一个空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;
}

rails console显示1项。

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

Here is an image of the empty div.

2 个答案:

答案 0 :(得分:1)

我明白了。在我的控制器中,我正在创建一个新对象但不保存它。我的.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>

答案 1 :(得分:0)

即使尚未保存,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循环不会执行任何操作(或抛出错误)空数组。