Понимание срока службы атрибута класса модели Rails
-
13-11-2019 - |
Вопрос
Ищу лучший способ выполнить проверку владения в модели Rails без раздувания моих контроллеров.Это означает, что мне нужно каким-то образом передать current_user модели.
В настоящее время я устанавливаю атрибут class в пользовательской модели для current_user в начале каждого запроса:
class User < ActiveRecord::Base
cattr_accessor :current_user
end
class ApplicationController < ActionController::Base
before_filter :set_current_user
def set_current_user
User.current_user = current_user
end
end
Я не уверен, полностью ли я понимаю время жизни User.current_user в этом сценарии.Возможно ли, что значение могло измениться во время запроса?
В первую очередь я хочу знать, безопасно ли использовать вышеприведенное, а также есть ли лучший подход.
Решение
Чтобы ответить на первую часть вашего вопроса.Атрибут будет сохранен в памяти, пока пользователь-класс не попадает / отправляется в сборщик мусора.Это обычно, когда VM или интерпретатор отключается.
В окружающей среде, такой как Heroku, эта переменная может быть сохранена между запросами, а неаутентифицированный пользователь будет иметь доступ к самому последнему пользователю, доступа к этой переменной, если только не устранено, когда первый пользователь сделан.
Другие советы
Это определенно правильный подход, если вы хотите соответствовать лучшим практикам. current_user
является методом контроллера, и, следуя Цепочка ответственности выкройка User
модель не должна знать, кто является текущим пользователем.
Это не безопасный подход :) Держите свое состояние в контроллерах, а бизнес-логику внутри моделей.
Если текущий_Узерс должен быть передан на модельный слой, то модель не должна заботиться о том, кто это.Вы всегда можете использовать ассоциации для фильтрации доступа к содержимому.
current_user.widgets.find(params[:id])