61 votes

Rails Devise : obtenir l'objet de l'utilisateur actuellement connecté ?

J'ai récemment installé Devise sur une application rails, et je me demande s'il est possible d'obtenir une instance de l'utilisateur actuellement connecté dans l'un des autres modèles ou contrôleurs, et si oui, comment faire ?

119voto

Scott Lowe Points 9412

Devise crée des méthodes pratiques à la volée qui représentent l'utilisateur actuellement connecté.

Cependant vous devez noter que le nom de la méthode générée inclut le nom de la classe de votre modèle utilisateur. Par exemple, si votre modèle Devise s'appelle User ' alors l'utilisateur actuellement connecté est accessible avec ' current_user et si votre classe Devise est Admin ' alors l'utilisateur admin connecté peut être accédé avec ' current_admin '.

Il existe un certain nombre d'autres méthodes créées avec des conventions similaires, par exemple ' user_signed_in? ou encore admin_signed_in? qui sont vraiment bien.

Ces méthodes sont disponibles dans les contrôleurs et les vues, de sorte que vous pourriez avoir les éléments suivants dans une vue :

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

Enfin, si vous utilisez deux ou plusieurs modèles Devise dans votre application (par exemple User et Admin), vous pouvez utiliser l'option ' anybody_signed_in? La méthode pratique ' pour vérifier si l'un de ces types d'utilisateurs est connecté :

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

Mise à jour :

Depuis la version 1.2.0 de Devise, ' anybody_signed_in? ' a été déprécié et remplacé par ' signed_in? '

1 votes

Tout ce que Scott dit est correct, mais aussi (et c'est peut-être nouveau aussi) Devise appelle user y admin ici "scopes". Si vous voyez ce mot dans la documentation, c'est à cela qu'il fait référence.

0 votes

Mais où se trouve cette information dans l'objet de la demande ?

16voto

John Points 4635

Les méthodes d'aide Devise sont uniquement disponibles au niveau des couches contrôleur et vue. Elles ne sont pas disponibles au niveau de la couche du modèle (voir la section Filtres et aides du contrôleur de la section README ).

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

Cela n'est pas possible via les méthodes d'aide par défaut que Devise crée pour vous. Cependant, il existe de nombreuses méthodes alternatives que vous pouvez utiliser pour fournir l'aide à l'utilisateur. current_user à un modèle. La méthode la plus simple a déjà été suggérée par Alex Bartlow, et consiste à simplement passer la balise current_user via une méthode à votre modèle.

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

Oui, c'est possible. Utilisez current_<modelname> , donde <modelname> est le nom du modèle qui possède des capacités d'authentification Devise (c'est-à-dire, par le biais de rails g devise <modelname> ). Si, par exemple, votre modèle est User alors vous utiliserez current_user . Si votre modèle est Elmo alors vous utiliserez current_elmo .

1voto

MaximuSSmile Points 11

La méthode est simple :

if @suit.user == current_user

exemple :

= 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"

1voto

Alex Bartlow Points 59

Passez-le en tant que paramètre à l'appel de la méthode :).

Une idée est d'utiliser Thread.current[:current_user] = @current_user en tant que before_filter - mais si vous utilisez une pile de déploiement comme Thin + EM_Mysql2 + Rack::FiberPool, vous devrez définir ce paramètre sur Fiber.current[:current_user] .

Ces solutions ne font que masquer un manque de logique de conception.

0 votes

Personnellement, je considère que coller des valeurs contextuelles sur l'objet du fil est une "odeur". Vous le reconnaissez dans la dernière ligne, alors bravo, mais je veux juste souligner que...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X