Rails: de onde vem o infame “current_user”?

94

Estive dando uma olhada recentemente em Rails e percebi que há muitas referências a current_user. Isso só vem do Devise? e devo defini-lo manualmente mesmo se usar o Devise? Existem pré-requisitos para usar current_user(como a existência de sessões, usuários, etc)?

batata grande
fonte

Respostas:

81

É definido por várias joias, por exemplo, Devise

Você precisará armazenar o user_id em algum lugar, geralmente na sessão após o login. Ele também assume que seu aplicativo tem e precisa de usuários, autenticação, etc.

Normalmente, é algo como:

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

Isso pressupõe que a classe de usuário existe, por exemplo #{Rails.root}/app/models/user.rb.

Atualizado: evite consultas adicionais ao banco de dados quando não houver um usuário atual.

Erik Peterson
fonte
As sessões são como um controlador / modelo comumente usado com a finalidade de controlar o status de login de um usuário? ou é embutido em trilhos?
bigpotato
sessionestá embutido no Rails. Por padrão, ele usa um cookie para manter o estado de um cliente entre as solicitações. Consulte Guides.rubyonrails.org/security.html#sessions para obter mais informações.
Erik Peterson,
2
NOTA: Se você estiver lendo esta resposta, certifique-se de incluir return unless session[:user_id]como mostrado na resposta de Zach - sem isso, cada if current_userverificação enquanto desconectado irá disparar outra consulta ao banco de dados.
DreadPirateShawn
10

Sim, current_userusa session. Você pode fazer algo semelhante em seu controlador de aplicativo se quiser lançar sua própria autenticação:

def current_user
  return unless session[:user_id]
  @current_user ||= User.find(session[:user_id])
end
Zach Kemp
fonte
As sessões são como um controlador / modelo comumente usado com a finalidade de controlar o status de login de um usuário? ou é embutido em trilhos?
bigpotato
1
sessioné meio parecido params, exceto que persiste para várias solicitações. Você pode usá-lo para armazenar qualquer tipo de parâmetro persistente exclusivo para seus usuários individuais (até que sua sessão expire ou eles efetuem logout). Você pode ler mais sobre isso aqui: ActionController: Acessando a sessão
Zach Kemp