web-dev-qa-db-fra.com

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 Alors, comment je fais ça?

58
GSto

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

Cependant vous devez noter que le nom de la méthode générée inclut le nom de classe de votre modèle utilisateur. par exemple. si votre modèle Devise est appelé 'User', l'utilisateur actuellement connecté peut être consulté avec 'current_user ', et si votre classe Devise est' Admin ', l'utilisateur admin connecté peut être consulté 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 sympas.

Ces méthodes sont disponibles dans les contrôleurs et les vues, vous pouvez donc 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 modèles Devise ou plus dans votre application (par exemple, utilisateur et administrateur), vous pouvez utiliser le 'anybody_signed_in? '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? 'est déconseillé et remplacé par' signed_in? '

117
Scott

Les méthodes d'assistance Devise ne sont disponibles que sur les couches de contrôleur et de vue. Ils ne sont pas disponibles au niveau de la couche modèle (voir la section Filtres et assistants du contrôleur de README ).

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

Ce n'est pas possible via les méthodes d'assistance par défaut que Devise crée pour vous. Cependant, il existe de nombreuses méthodes alternatives que vous pouvez utiliser pour fournir le current_user à un modèle. La manière la plus simple a déjà été suggérée par Alex Bartlow, et c'est simplement de passer le 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. Utilisation current_<modelname>, où <modelname> est le nom du modèle doté de capacités d'authentification Devise (c'est-à-dire via Rails g devise <modelname>). Si, par exemple, votre modèle est User, vous utiliserez current_user. Si votre modèle est Elmo, vous utiliserez current_elmo.

15
John

la méthode simple est:

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"
1
MaximuSSmile

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

Une idée consiste à utiliser Thread.current[:current_user] = @current_user comme un before_filter - mais si vous utilisez une pile de déploiement comme Thin + EM_Mysql2 + Rack :: FiberPool, vous devrez la définir sur Fiber.current[:current_user].

Ces solutions ne font que couvrir un manque de bonne logique de conception.

1
Alex Bartlow