2011-07-21 65 views
5

在Rails 3.1應用程序,我有一種方法稱爲user_logged_in?來自Devise,我想用來有選擇地呈現部分。以下是layouts/application.html.erb中的代碼:Rails 3,只渲染部分,如果用戶登錄

<% if user_logged_in? %> 
<%= render :partial => "home/statusbar" %> 
<% end %> 

它使用來自不同控制器的部分。這是部分:在current_user.name(未定義的方法)發生

<div id="status_bar"> 
    Signed in as <%= link_to current_user.name, edit_user_registration_path %> 
</div> 

錯誤,因爲current_usernil。我可以將user_logged_in?檢查移入部分內部,但我認爲如果它位於視圖中,效率會稍高一些。

您能指導我瞭解最佳實踐,或者我如何克服未定義的方法錯誤? Rails是否正常檢查模板的代碼,即使它在if塊中失敗?

回答

13

它看起來像user_logged_in?是哪裏出了問題。如果你改變這個,它會工作嗎?

<% if current_user.present? %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 
+3

是的,它的確如此。如果我使用user_signed_in?它也可以。完全錯誤的方法。對不起,謝謝! – joseph

1

該代碼正在運行,ruby是鴨類型和動態的,所有檢查都在運行時。所以你需要檢查你的條件。嘗試

<% if false %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 

並查看它是否失敗。 一個bettter的解決辦法是

<% if current_user %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 

我不熟悉色器件但這應該工作 因爲如果沒有人在

+0

你說得對,我應該使用user_signed_in,而不是user_logged_in!感謝您提供豐富的答案。 – joseph

4

登錄當前用戶時便會無我熟悉的設計,而不是user_logged_in?方法 - 你自己定義了嗎?視圖中使用的普通幫助程序是user_signed_in?。此外,你可以試試下面的:

<% puts user_logged_in?.inspect %> 
<% puts user_signed_in?.inspect %> 

以上視圖中的if語句,並檢查您的日誌,以確保您的通話正確返回falseuser_signed_in?也應該返回false)。除非它實際上被渲染(這意味着代碼輸入了if語句),否則您不應該在該部分中獲得零錯誤。

0

有渲染你的部分是有條件

<%= render(partial: "home/statusbar") if current_user.present? %> 
1

我找到了解決辦法更短的方式,似乎

user_logged_in? 

不再使用,而是需要使用

user_signed_in? 

因此,你給這個代碼應該工作:

<% if user_signed_in? %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 

此代碼爲我提供了一個部分。