ruby-on-rails devise寄信 - Rails Devise:獲取當前登錄用戶的對象?





authentication_token sign_in (5)


Devise可以動態創建代表當前登錄用戶的便捷方法。

但是,您應該注意,生成的方法名稱包括用戶模型的類名。 例如,如果你的Devise模型被稱為' User ',那麼可以使用' current_user '訪問當前登錄的用戶,如果你的Devise類是' Admin ',那麼可以使用' current_admin '訪問登錄的admin用戶。

還有許多使用類似約定創建的其他方法,例如' user_signed_in? '或再次' admin_signed_in? ',這真的很棒。

這些方法在控制器和視圖中可用,因此您可能在視圖中具有以下內容:

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

最後,如果您在應用程序中使用兩個或更多Devise模型(例如User和Admin),您可以使用' anybody_signed_in? '檢查這些類型的用戶是否已登錄的便捷方法:

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

更新:

自Devise 1.2.0版以來,' anybody_signed_in? '已被棄用並被' signed_in?取代signed_in?

我最近在rails應用程序上安裝了Devise,我想知道是否有可能在其他任何一個模型或控制器中獲取當前登錄用戶的實例,如果是這樣,我該怎麼做?




將其作為參數傳遞給方法調用:)。

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

這些解決方案實際上只是為了彌補缺乏良好的設計邏輯。




簡單的方法是:

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"



Devise輔助方法僅在控制器和視圖層可用。 它們在模型層不可用(請參閱README Controller過濾器和幫助程序部分)。

  • 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>是具有Devise身份驗證功能的模型的名稱(即,通過rails g devise <modelname> )。 例如,如果您的模型是User ,那麼您將使用current_user 。 如果您的模型是Elmo ,那麼您將使用current_elmo




那麼,怎麼了? 只需運行rails g devise:views [model_name] ,自定義每個註冊表單,並在config/initializer/devise.rb放置config.scoped_views = true





ruby-on-rails ruby-on-rails-plugins devise