为什么提交无效帖子会破坏微博提供(Railstutorial第11章)?

时间:2015-11-22 05:08:31

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2 railstutorial.org

我大约在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从数据库中抽取微博,因为提交的微博上存在验证而只包含有效的微博。

2 个答案:

答案 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}}操作。然后创建homeStaticPagesController。一切都运行良好。

如果微博确实保存,那么您将继续@micropost,并尝试渲染@feed_items模板。为此,您需要StaticPagesControllerstatic_pages/home个实例变量,但此时您只定义了@micropost

这就是为什么建议的解决方法是在尝试渲染模板之前将@feed_items实例变量定义为空数组。