Я временно использую Rails в качестве внешнего интерфейса для связи с API.
После аутентификации я установил user_id в куки.
Я использую гем her для вызова пользователя из API и сохранения его в переменной экземпляра.
Проблема в том, что я делаю этот запрос на каждой странице, и хотел бы сделать это один раз. Это похоже на то, что @current_user сбрасывается после каждой страницы.
def current_user
#User.find -> Her model
@current_user ||= User.find(cookies.signed[:user_id]) if cookies.signed[:user_id]
end





Нет четкого решения, потому что ваш пользователь приходит из API. Вы можете попробовать сделать что-то подобное:
#remember user attributes without references
session['user'] = @current_user.attributes #remember
@user = OpenStruct(session['user']) #load, allow call @user.name etc, but not @user.posts
#use class variable
class User
include Her::Model
@@tmp = {}
def remember
@@tmp[id] = self
#call job etc to delete user from tmp to prevent something that reminds "memory leak"
end
def self.local_find(id)
@@tmp[id]
end
end
def current_user
@current_user ||= User.local_find(cookies.signed[:user_id]) ||
User.find(cookies.signed[:user_id]) if cookies.signed[:user_id]
end
Основная причина, по которой не следует хранить (запоминать) объекты в сеансе (долгосрочная переменная), заключается в том, что если структура объекта изменится, вы получите исключение.
Я не уверен, что это полезно, но все переменные вашего экземпляра будут сбрасываться между запросами. Если вы хотите, чтобы он устанавливался в начале каждого запроса, вы можете использовать обратный вызов
before_action, который устанавливает переменную.