2010-11-10 11 views

risposta

112

Devise crea al volo metodi di convenienza che rappresentano l'utente attualmente registrato.

Tuttavia, si deve notare che il nome del metodo generato include il nome classe del modello utente. per esempio. se il tuo modello Devise è chiamato 'User', l'utente attualmente connesso può accedere con 'current_user', e se la tua classe Devise è 'Admin', allora l'utente amministratore connesso può accedere con 'current_admin'.

Esistono numerosi altri metodi creati con convenzioni simili, ad esempio "user_signed_in?" o ancora "admin_signed_in?", che sono davvero carini.

Questi metodi sono disponibili in controller e viste così si potrebbe avere la seguente in una vista:

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

Infine, se si utilizza due o più ideare modelli nella tua app (ad esempio, utente e amministratore), è possibile utilizzare il 'anybody_signed_in?' metodo comodo per verificare se uno di questi tipi di utenti sono firmati in:

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

Aggiornamento:

Poiché Devise versione 1.2.0, 'anybody_signed_in?' è stata ritirata e sostituita da 'signed_in?'

+1

Tutto ciò che Scott dice è corretto, ma anche (e potrebbe anche essere nuovo) Devise chiama 'user' e' admin' qui " ambiti". Se vedi questa parola nella documentazione, è a questo che si riferisce. – Peeja

+0

Ma dove nell'oggetto richiesta ci sono queste informazioni? – mehulkar

1

Passare come parametro alla chiamata metodo :).

Un'idea è quella di utilizzare Thread.current[:current_user] = @current_user come before_filter - ma se si sta utilizzando una pila distribuzione come Thin + EM_Mysql2 + Rack :: FiberPool, dovrete impostare che a Fiber.current[:current_user].

Queste soluzioni nascondono solo una mancanza di buona logica di progettazione.

+0

Personalmente ritengo attaccare valori contestuali sull'oggetto filo di essere un "odore". Lo ammetti nell'ultima riga, quindi complimenti, ma voglio solo enfatizzare che ... – jaydel

15

sono disponibili solo negli strati controller e visualizzare i metodi helper escogitare. Non sono disponibili a livello di modello (vedere la sezione Filtri e assistenti di controller di README).

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

Non è possibile tramite i metodi di supporto predefiniti creati da Devise. Tuttavia, esistono molti metodi alternativi che è possibile utilizzare per fornire il modello current_user a un modello. Il modo più semplice è già stato suggerito da Alex Bartlow, ovvero passare semplicemente lo current_user tramite un metodo al modello.

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

sì è possibile. Utilizzare current_<modelname>, dove <modelname> è il nome del modello con funzionalità di autenticazione Devise (ad esempio, tramite rails g devise <modelname>).Se, ad esempio, il modello è User, utilizzare current_user. Se il tuo modello è Elmo, allora dovresti usare current_elmo.

1

metodo semplice è:

if @suit.user == current_user 

esempio:

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