我大约在Hartl的Railstutorial第11章的中途,它将展示如何在主页上添加微博饲料。它通过代码完成此任务:
@feed_items = current_user.feed.paginate(page: params[:page])
其中Feed是方法
def feed
Micropost.where("user_id = ?", id)
end
现在在主页中,微博饲料被认为是部分包含:
<% if @feed_items.any? %>
<ol class="microposts">
<%= render @feed_items %>
</ol>
<%= will_paginate @feed_items %>
<% end %>
现在教程提到在主页上,如果你提交了一个无效的微博,它将会破坏:
“在微博提交失败时,主页需要@feed_items 实例变量,因此失败的提交目前中断。“
我不明白这为什么会破坏的解释。 @feed_items
不应该包含数据库中所有其他有效的微博吗?因此,即使您提交的帖子无效,@ fed_items也会填充以前的有效微博?我不明白无效的微博如何能够影响@feed_items,特别是因为@feed_items从数据库中抽取微博,因为提交的微博上存在验证而只包含有效的微博。
答案 0 :(得分:1)
因为当@feed_items
nil
为@feed_items.any?
时,当您在视图中致电:nil.any?
时,这将是NoMethodError: undefined method `any?' for nil:NilClass
,并且会因以下错误消息而失败:
l
答案 1 :(得分:0)
当您提交微博时,请拨打create
的{{1}}操作:
MicropostsController
如果成功保存微博,则会重定向。调用def create
@micropost = current_user.microposts.build(micropost_params)
if @micropost.save
flash[:success] = "Micropst created"
redirect_to root_url
else
render 'static_pages/home'
end
end
的{{1}}操作。然后创建home
和StaticPagesController
。一切都运行良好。
如果微博确实不保存,那么您将继续@micropost
,并尝试渲染@feed_items
模板。为此,您需要StaticPagesController
和static_pages/home
个实例变量,但此时您只定义了@micropost
。
这就是为什么建议的解决方法是在尝试渲染模板之前将@feed_items
实例变量定义为空数组。