Rails的devise:获取当前login用户的对象?
我最近在Rails应用程序上安装了Devise,我想知道是否有可能在其他模型或控制器中获得当前login用户的实例,如果是这样,我该怎么做?
devise创build表示您当前login的用户的即时方法。
但是,您应该注意生成的方法名称包含您的用户模型的类名称。 例如,如果您的Devise模型被称为“ User
”,那么当前login的用户可以用' current_user
'来访问,如果Devise类是' Admin
',那么login的pipe理员用户可以用' current_admin
'来访问。
还有一些类似的约定创build的其他方法,例如' user_signed_in?
'还是' admin_signed_in?
',这真的很好。
这些方法在控制器和视图中可用,因此您可能在视图中具有以下内容:
<% if user_signed_in? %> <div>Signed in as... <%= current_user.email %></div> <% end %>
最后,如果您在应用程序中使用两个或更多Devise模型(例如用户和pipe理员),则可以使用“ anybody_signed_in?
'方便的方法来检查是否有任何types的用户login:
<% 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?
“
Devise帮助器方法仅在控制器和视图层可用。 它们在模型层不可用(请参阅README的控制器filter和帮助器部分)。
-
Is it possible to get the currently logged in user from within a model?
。
这是不可能通过Devise为您创build的默认帮助器方法。 但是,您可以使用许多替代方法将current_user
提供给模型。 Alex Bartlow已经提出了最简单的方法,那就是简单地通过一个方法将current_user
传递给你的模型。
-
Is it possible to get the currently logged in user from within a controllers?
对的,这是可能的。 使用current_<modelname>
,其中<modelname>
是具有Devise身份validationfunction的模型的名称(即,通过rails g devise <modelname>
)。 例如,如果您的模型是User
,那么您将使用current_user
。 如果你的模型是Elmo
,那么你会使用current_elmo
。
将其作为parameter passing给方法调用:)。
一个想法是使用Thread.current[:current_user] = @current_user
作为before_filter – 但是如果您使用Thin + EM_Mysql2 + Rack :: FiberPool等部署堆栈,则需要将其设置为Fiber.current[:current_user]
。
这些解决scheme实际上只是掩盖了缺乏良好的devise逻辑。
简单的方法是:
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"