2010-11-10 96 views

回答

112

設計創建表示您當前登錄的用戶的即時方法。

但是您應該注意生成的方法名稱包含您的用戶模型的類名稱。例如如果您的Devise模型被稱爲'User',那麼當前登錄的用戶可以通過'current_user'訪問,如果您的Devise類爲'Admin',則可以使用'current_admin'訪問登錄的管理員用戶。

還有一些類似的約定創建的其他方法,例如'user_signed_in?'或再'admin_signed_in?',這是非常好的。

這些方法在控制器和視圖中可用,所以你可能在一個視圖:

<% if user_signed_in? %> 
    <div>Signed in as... <%= current_user.email %></div> 
<% end %> 

最後,如果你正在使用兩個或更多的設計在您的應用程序模型(例如用戶和管理員)您可以使用「anybody_signed_in?」方便的方法來檢查如果任這些類型的用戶已登錄:

<% if anybody_signed_in? %> 
    <h2>Special offers</h2> 
    <p>All registered users will receive free monkeys!</p> 
<% end %> 

更新:

由於設計版本1.2.0,「anybody_signed_in?」已棄用,由「signed_in?

+1

斯科特說的一切都是正確的,但也(這也可能是新的)設計在這裏調用'user'和'admin'「範圍」。如果你在文檔中看到這個詞,那就是它所指的。 – Peeja 2015-03-09 20:37:00

+0

但請求對象中的這個信息是什麼? – mehulkar 2015-05-10 02:07:09

1

將它作爲參數傳遞給方法調用:)。

一個想法是使用Thread.current[:current_user] = @current_user作爲before_filter - 但是如果您使用Thin + EM_Mysql2 + Rack :: FiberPool等部署堆棧,則需要將其設置爲Fiber.current[:current_user]

這些解決方案真的只是掩蓋了缺乏良好的設計邏輯。

+0

個人我考慮粘上下文值到螺紋對象是一個 「氣味」。你承認,在最後一行,很榮幸,但我只是想強調...... – jaydel 2013-06-29 18:05:06

15

替換的設計輔助方法只適用於在控制器和視圖層。它們在模型層不可用(請參閱README的控制器過濾器和幫助器部分)。

  • Is it possible to get the currently logged in user from within a model?

通過Devise爲您創建的默認幫助器方法是不可能的。但是,您可以使用許多替代方法將current_user提供給模型。 Alex Bartlow已經提出了最簡單的方法,那就是簡單地通過一個方法將current_user傳遞給你的模型。

  • Is it possible to get the currently logged in user from within a controllers?

是的,它是可能的。使用current_<modelname>,其中<modelname>是具有設計身份驗證功能(即通過rails g devise <modelname>)的模型的名稱。例如,如果您的型號是User,那麼您將使用current_user。如果您的型號是Elmo,那麼您將使用current_elmo

1

簡單的方法是:

if @suit.user == current_user 

例如:

= link_to "Back", root_path, class: "btn btn-default" 

    -if @suit.user == current_user 

    = link_to "Edit", edit_suit_path, class: "btn btn-default" 

    = link_to "Delete", suit_path, method: :delete, data: {confirm: "Are you sure?" }, class: "btn btn-default"