2010-11-10 16 views

Respuesta

112

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. p.ej. si su modelo Devise se llama 'User', se puede acceder al usuario actualmente conectado con 'current_user', y si su clase Devise es 'Admin', se puede acceder al usuario administrador con 'current_admin'.

Existen otros métodos creados con convenciones similares, por ejemplo 'user_signed_in?' o 'admin_signed_in?', que son realmente agradables.

Estos métodos están disponibles en los controladores y puntos de vista lo que podría tener el siguiente en una vista:

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

Por último, si está utilizando dos o más idear modelos en su aplicación (por ejemplo, usuario y admin), se puede utilizar el 'anybody_signed_in?' método de conveniencia para comprobar si alguno de estos tipos de usuarios se firman en:

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

actualización:

Desde Devise versión 1.2.0, 'anybody_signed_in?' ha dejado de utilizarse y se sustituye por 'signed_in?'

+1

Todo lo que Scott dice es correcto, pero también (y esto puede ser nuevo también) Idear llama 'usuario' y' admin' aquí " alcances ". Si ves esa palabra en la documentación, eso es a lo que se refiere. – Peeja

+0

Pero, ¿en qué parte del objeto de solicitud está esta información? – mehulkar

1

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

Una idea es utilizar Thread.current[:current_user] = @current_user como before_filter - pero si usted está utilizando una pila de despliegue como Thin + EM_Mysql2 + rack :: FIBERPOOL, se tendrá que establecer que a Fiber.current[:current_user].

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

+0

Personalmente considero que pega valores contextuales sobre el objeto hilo a ser un "olor". Lo reconoces en la última línea, así que felicitaciones, pero solo quiero enfatizar que ... – jaydel

15

Los métodos de ayuda Idear sólo están disponibles en las capas de controlador y la vista. 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 current_user a un modelo. La forma más simple ya ha sido sugerida por Alex Bartlow, y es simplemente pasar el current_user a través de un método para 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.

1

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" 
Cuestiones relacionadas