Rails: skąd pochodzi niesławny „current_user”?

94

Rozejrzałem się ostatnio po Railsach i zauważyłem, że istnieje wiele odniesień do current_user. Czy to pochodzi tylko od Devise? i czy muszę ręcznie definiować to samodzielnie, nawet jeśli używam Devise? Czy istnieją warunki wstępne do korzystania current_user(takie jak istnienie sesji, użytkowników itp.)?

bigpotato
źródło

Odpowiedzi:

82

Definiuje go kilka klejnotów, np. Devise

Będziesz musiał gdzieś przechowywać identyfikator user_id, zwykle w sesji po zalogowaniu. Zakłada się również, że Twoja aplikacja ma i potrzebuje użytkowników, uwierzytelniania itp.

Zazwyczaj jest to coś takiego:

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

Zakłada się, że klasa User istnieje, np #{Rails.root}/app/models/user.rb.

Zaktualizowano: unikaj dodatkowych zapytań do bazy danych, gdy nie ma bieżącego użytkownika.

Erik Peterson
źródło
czy sesje są czymś w rodzaju powszechnie używanego kontrolera / modelu do kontrolowania statusu logowania użytkowników? czy jest wbudowany w szyny?
bigpotato
sessionjest wbudowany w Railsy. Domyślnie używa pliku cookie do utrzymywania stanu klienta między żądaniami. Więcej informacji znajdziesz na guide.rubyonrails.org/security.html#sessions .
Erik Peterson
2
UWAGA: Jeśli czytasz tę odpowiedź, pamiętaj, aby uwzględnić to, return unless session[:user_id]co pokazano w odpowiedzi Zacha - bez tego każde if current_usersprawdzenie po wylogowaniu spowoduje kolejne zapytanie do bazy danych.
DreadPirateShawn,
10

Tak, current_userużywa session. Możesz zrobić coś podobnego w kontrolerze aplikacji, jeśli chcesz przeprowadzić własne uwierzytelnianie:

def current_user
  return unless session[:user_id]
  @current_user ||= User.find(session[:user_id])
end
Zach Kemp
źródło
czy sesje są czymś w rodzaju powszechnie używanego kontrolera / modelu do kontrolowania statusu logowania użytkowników? czy jest wbudowany w szyny?
bigpotato
1
sessionjest trochę jak params, z wyjątkiem tego, że utrzymuje się dla wielu żądań. Możesz go użyć do przechowywania dowolnego rodzaju trwałego parametru unikalnego dla poszczególnych użytkowników (do wygaśnięcia ich sesji lub wylogowania). Możesz przeczytać więcej na ten temat tutaj: ActionController: Accessing the Session
Zach Kemp