我似乎无法弄清楚为什么我的红宝石 .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
答案 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
循环不会执行任何操作(或抛出错误)空数组。