Rails: откуда взялся пресловутый «current_user»?

95

Недавно я заглянул в Rails и заметил, что есть много ссылок на current_user. Это только от Devise? и должен ли я сам определять его вручную, даже если я использую Devise? Есть ли предварительные условия для использования current_user(например, наличие сеансов, пользователей и т. Д.)?

большой картофель
источник

Ответы:

84

Его определяют несколько драгоценных камней, например Devise

Вам нужно будет где-то сохранить user_id, обычно в сеансе после входа в систему. Также предполагается, что ваше приложение имеет пользователей и нуждается в них, аутентификация и т. Д.

Обычно это примерно так:

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

Это предполагает, что класс User существует, например #{Rails.root}/app/models/user.rb.

Обновлено: избегайте дополнительных запросов к базе данных, когда нет текущего пользователя.

Эрик Петерсон
источник
Сеансы похожи на обычно используемый контроллер / модель для управления статусом входа пользователя? или он встроен в рельсы?
bigpotato
sessionвстроен в Rails. По умолчанию он использует cookie для поддержания состояния клиента между запросами. См. Guides.rubyonrails.org/security.html#sessions для получения дополнительной информации.
Эрик Петерсон
2
ПРИМЕЧАНИЕ. Если вы читаете этот ответ, обязательно укажите, return unless session[:user_id]как показано в ответе Зака ​​- без этого каждая if current_userпроверка при выходе из системы будет запускать другой запрос к базе данных.
DreadPirateShawn 06
10

Да, current_userиспользует session. Вы можете сделать что-то подобное в своем контроллере приложения, если хотите выполнить собственную аутентификацию:

def current_user
  return unless session[:user_id]
  @current_user ||= User.find(session[:user_id])
end
Зак Кемп
источник
Сеансы похожи на обычно используемый контроллер / модель для управления статусом входа пользователей? или он встроен в рельсы?
bigpotato
1
sessionвроде как params, но сохраняется для нескольких запросов. Вы можете использовать его для хранения любых постоянных параметров, уникальных для ваших отдельных пользователей (до истечения срока их сеанса или выхода из системы). Вы можете узнать больше об этом здесь: ActionController: Доступ к сеансу
Зак Кемп