Вопрос

Ищу лучший способ выполнить проверку владения в модели 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])

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top