2

我正在介紹Hartl的Railstutorial第11章的一半,它介紹瞭如何在主頁上添加micropost feed。它通過代碼:爲什麼提交一個無效的帖子會打破micropost feed(Railstutorial chapter 11)?

@feed_items = current_user.feed.paginate(page: params[:page]) 

,其中飼料的方法

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不應該包含數據庫中所有其他有效的微博嗎?因此,即使您提交了無效帖子,@feed_items也會填充以前有效的微博嗎?我不明白無效micropost是如何影響@feed_items的,尤其是因爲@feed_items從數據庫中提取微博,微博僅包含有效的微博,因爲提交的微博上存在驗證。

回答

1

因爲那麼@feed_itemsnil,當你撥打:@feed_items.any?在你看來,這將是nil.any?,這將失敗,此錯誤消息:

NoMethodError: undefined method `any?' for nil:NilClass 
+1

我不太確定@feed_items是如何變成零的,因爲它從數據庫中繪製微博,微博有效的微博。我在這裏做什麼? – user2889046

+0

因爲如果micropost提交失敗,那麼你在'params'中不會有一個有效的'id',所以你的'feed'方法將不起作用,所以你的'@ feed_items'不會被填充。現在清楚了嗎? –

+0

是的,謝謝你的幫助 – user2889046

0

當你提交一個微柱,你叫createMicropostsController的操作:

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 

如果微博保存成功,您將被重定向。調用StaticPagesControllerhome操作。然後創建@micropost@feed_items。一切運行良好。

如果微博確實不是保存成功,那麼你留在StaticPagesController,並嘗試渲染static_pages/home模板。爲此,您需要@micropost@feed_items實例變量,但此時您只需定義@micropost

這就是爲什麼建議的解決方法是在嘗試呈現模板之前將@feed_items實例變量定義爲空數組。

相關問題