rails gema create ruby-on-rails ruby-on-rails-plugins devise

ruby-on-rails - gema - rails authentication



Rails Devise: ¿Obtiene el objeto del usuario actualmente conectado? (4)

Recientemente instalé Devise en una aplicación de rieles, y me pregunto si es posible obtener una instancia del usuario actualmente conectado en cualquiera de los otros modelos o controladores, y si es así, ¿cómo puedo hacer eso?


Devise crea métodos de conveniencia sobre la marcha que representan a su usuario actualmente registrado.

Sin embargo , debe tener en cuenta que el nombre del método generado incluye el nombre de clase de su modelo de usuario. por ejemplo, si su modelo Devise se llama '' User '', entonces se puede acceder al usuario actualmente conectado con '' current_user '', y si su clase Devise es '' Admin '', entonces se puede acceder al usuario administrador conectado con '' current_admin ''.

Hay varios otros métodos creados con convenciones similares, por ejemplo '' user_signed_in? ''o de nuevo'' admin_signed_in? '', que son realmente agradables

Estos métodos están disponibles en controladores y vistas, por lo que puede tener lo siguiente en una vista:

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

Finalmente, si está utilizando dos o más modelos de Devise en su aplicación (por ejemplo, usuario y administrador), puede usar '' anybody_signed_in? ''método de conveniencia para verificar si alguno de esos tipos de usuario está registrado:

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

Actualizar:

Desde la versión 1.2.0 de Devise, '' anybody_signed_in? ''ha sido desaprobado y reemplazado por'' signed_in? ''


Los métodos de ayuda de Devise solo están disponibles en el controlador y en las capas de visualización. No están disponibles en la capa del modelo (consulte la sección Filtros del controlador y ayudantes de README ).

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

No es posible a través de los métodos de ayuda predeterminados que crea Devise para usted. Sin embargo, hay muchos métodos alternativos que puede usar para proporcionar el current_user a un modelo. La forma más simple ya ha sido sugerida por Alex Bartlow, y es simplemente pasar el current_user través de un método a su modelo.

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

Sí, es posible. Use current_<modelname> , donde <modelname> es el nombre del modelo que tiene capacidades de autenticación Devise (es decir, a través de rails g devise <modelname> ). Si, por ejemplo, su modelo es User , entonces usaría current_user . Si su modelo es Elmo , entonces usaría current_elmo .


Páselo como un parámetro para la llamada al método :).

Una idea es usar Thread.current[:current_user] = @current_user como before_filter, pero si está utilizando una pila de implementación como Thin + EM_Mysql2 + Rack :: FiberPool, deberá configurarla en Fiber.current[:current_user] .

Esas soluciones realmente están cubriendo la falta de una buena lógica de diseño.


método simple es:

if @suit.user == current_user

ejemplo:

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