Rails: ¿de dónde viene el infame "current_user"?

94

Recientemente he estado mirando Rails y he notado que hay muchas referencias a current_user. ¿Esto solo proviene de Devise? y ¿tengo que definirlo manualmente yo mismo incluso si uso Devise? ¿Existen requisitos previos para el uso current_user(como la existencia de sesiones, usuarios, etc.)?

patata grande
fuente

Respuestas:

82

Está definido por varias gemas, por ejemplo, Devise

Deberá almacenar el user_id en algún lugar, generalmente en la sesión después de iniciar sesión. También asume que su aplicación tiene y necesita usuarios, autenticación, etc.

Normalmente, es algo como:

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

Esto supone que existe la clase de usuario, por ejemplo #{Rails.root}/app/models/user.rb.

Actualizado: evita consultas adicionales a la base de datos cuando no hay un usuario actual.

Erik Peterson
fuente
¿Son las sesiones algo así como un controlador / modelo de uso común con el fin de controlar el estado de inicio de sesión de un usuario? ¿O está integrado en rieles?
bigpotato
sessionestá integrado en Rails. De forma predeterminada, utiliza una cookie para mantener el estado de un cliente entre solicitudes. Consulte guides.rubyonrails.org/security.html#sessions para obtener más información.
Erik Peterson
2
NOTA: Si está leyendo esta respuesta, asegúrese de incluirla return unless session[:user_id]como se muestra en la respuesta de Zach; sin eso, cada if current_userverificación mientras esté desconectado activará otra consulta de base de datos.
DreadPirateShawn
10

Sí, current_userusa session. Puede hacer algo similar en el controlador de su aplicación si desea implementar su propia autenticación:

def current_user
  return unless session[:user_id]
  @current_user ||= User.find(session[:user_id])
end
Zach Kemp
fuente
¿Son las sesiones algo así como un controlador / modelo de uso común con el fin de controlar el estado de inicio de sesión de un usuario? ¿O está integrado en rieles?
bigpotato
1
sessiones algo así params, excepto que persiste para múltiples solicitudes. Puede usarlo para almacenar cualquier tipo de parámetro persistente exclusivo de sus usuarios individuales (hasta que su sesión expire o cierren la sesión). Puede leer más sobre esto aquí: ActionController: Acceso a la sesión
Zach Kemp