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"