[英]Rails 3, only rendering partial if a user is logged in
在 Rails 3.1 應用程序上,我有一個名為user_logged_in?
來自 Devise,我想用它來選擇性地渲染部分。 這是 layouts/application.html.erb 中的代碼:
<% if user_logged_in? %>
<%= render :partial => "home/statusbar" %>
<% end %>
它使用來自不同 controller 的部分。 這是部分:
<div id="status_bar">
Signed in as <%= link_to current_user.name, edit_user_registration_path %>
</div>
current_user.name
(未定義的方法)發生錯誤,因為current_user
為nil
。 我可以移動user_logged_in?
檢查部分內部,但我認為如果它在視圖中會稍微更有效率。
您能否指導我了解最佳實踐是什么,或者我如何克服未定義的方法錯誤? Rails 檢查模板的代碼是否正常,即使它位於失敗的if
塊中?
它看起來像user_logged_in?
是哪里出了問題。如果你改變它,它會起作用嗎?
<% if current_user.present? %>
<%= render :partial => "home/statusbar" %>
<% end %>
我熟悉 Devise,但不熟悉user_logged_in?
方法 - 你自己定義的嗎? 視圖中使用的普通助手是user_signed_in?
. 另外,請嘗試以下操作:
<% puts user_logged_in?.inspect %>
<% puts user_signed_in?.inspect %>
在您視圖中的 if 語句上方,並檢查您的日志以確保您的調用正確返回false
( user_signed_in?
也應該返回false
)。 您不應該在該部分中收到 nil 錯誤,除非它實際上正在呈現(意味着代碼輸入了 if 語句)。
我找到了解決方案,看來
user_logged_in?
不再使用,而是您需要使用
user_signed_in?
因此,使用您提供的代碼應該可以工作:
<% if user_signed_in? %>
<%= render :partial => "home/statusbar" %>
<% end %>
這段代碼為我呈現了一部分。
該代碼正在運行,ruby 是鴨子類型和動態的,所有檢查都在運行時進行。 所以你需要檢查你的條件。 嘗試
<% if false %>
<%= render :partial => "home/statusbar" %>
<% end %>
看看它是否仍然失敗。 更好的解決方案是
<% if current_user %>
<%= render :partial => "home/statusbar" %>
<% end %>
我不熟悉 devise 但這應該可以工作因為如果沒有人登錄,當前用戶將為零
有一個更短的方法來渲染你的部分有條件
<%= render(partial: "home/statusbar") if current_user.present? %>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.