Rails: da dove viene il famigerato "current_user"?


94

Recentemente ho guardato intorno a Rails e ho notato che ci sono molti riferimenti a current_user. Viene solo da Devise? e devo definirlo manualmente anche se utilizzo Devise? Ci sono prerequisiti per l'utilizzo current_user(come l'esistenza di sessioni, utenti, ecc.)?

Risposte:


81

È definito da diverse gemme, ad esempio Devise

Dovrai memorizzare user_id da qualche parte, di solito nella sessione dopo l'accesso. Si presuppone inoltre che la tua app abbia e abbia bisogno di utenti, autenticazione, ecc.

In genere, è qualcosa del tipo:

class ApplicationController < ActionController::Base
  def current_user
    return unless session[:user_id]
    @current_user ||= User.find(session[:user_id])
  end
end

Ciò presuppone che esista la classe User, ad es #{Rails.root}/app/models/user.rb.

Aggiornato: evita query di database aggiuntive quando non c'è un utente corrente.


le sessioni sono un po 'come un controller / modello comunemente usato allo scopo di controllare lo stato di accesso di un utente? o è integrato nei binari?
bigpotato

sessionè integrato in Rails. Per impostazione predefinita, utilizza un cookie per mantenere lo stato di un client tra le richieste. Vedi guides.rubyonrails.org/security.html#sessions per maggiori informazioni.
Erik Peterson

2
NOTA: se stai leggendo questa risposta, assicurati di includere return unless session[:user_id]come mostrato nella risposta di Zach - senza di ciò, ogni if current_usercontrollo mentre sei disconnesso attiverà un'altra query sul database.
DreadPirateShawn

10

Sì, current_userutilizza session. Puoi fare qualcosa di simile nel tuo controller dell'applicazione se vuoi eseguire la tua autenticazione:

def current_user
  return unless session[:user_id]
  @current_user ||= User.find(session[:user_id])
end

le sessioni sono un po 'come un controller / modello comunemente usato allo scopo di controllare lo stato di accesso di un utente? o è integrato nei binari?
bigpotato

1
sessionè un po 'come params, tranne che persiste per più richieste. Puoi usarlo per memorizzare qualsiasi tipo di parametro persistente univoco per i tuoi singoli utenti (fino alla scadenza della loro sessione o alla disconnessione). Puoi leggere di più al riguardo qui: ActionController: Accessing the Session
Zach Kemp
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.