Как получить доступ к текущему пользователю Warden в бизнес-логике в Rails3 - PullRequest
2 голосов
/ 29 марта 2011

Я использую плагин Rails Warden . Он определяет вспомогательный метод 'пользователь', который возвращает текущего пользователя. Смотрите ссылку для исходного кода.

Теперь у меня есть объект бизнес-логики, который не имеет никакой ссылки на контроллер. Но я бы хотел получить текущего пользователя. Есть ли способ получить к этому доступ?

Я пытался

ActionController::Base.helpers.user

или даже

RailsWarden::Mixins::HelperMethods.user

без удачи. Спасибо.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011

Теперь у меня есть объект бизнес-логики, который не имеет никакой ссылки на контроллер.Но я бы хотел получить текущего пользователя.Есть ли какой-нибудь способ получить доступ к этому?

Так почему же вы не можете просто передать текущего пользователя этим методам?

Кроме того, вы можете смешать их.

Я настоятельно не рекомендую вам писать статические помощники (это не Java, это Ruby!).Вместо этого, если вам нужны эти помощники, включите их в виде модуля:

module SuperLogic
 def calculate_stuff(current_user=nil)
  (current_user || user || self).bills.sum
 end
edn

Затем включите его там, где вам это нужно:

# user model
class User
  include SuperLogic
  #it will get the `calculate_stuff` method
end

# controller
include SuperLogic
# so you can use it as one of
calculate_stuff user
calculate_stuff

и так далее ...

кроме того, когда вы получаете доступ к своей бизнес-логике, вы можете просто создать экземпляр класса вместо «статических» методов (в ruby ​​они являются «классовыми» методами):

# controller
def calculate
  @result = BusinessLogic.new(user).calculate_stuff
end

Это, вероятно, самая простая вещьвы можете это сделать.

На самом деле вам не нужен доступ ко всему HTTP-контексту в ваших бизнес-объектах (я даже не говорю о его тестировании).

0 голосов
/ 15 мая 2011

То, как я думаю о бизнес-логике, это то, что находится между контроллером и моделью. Я думаю, что было бы нормально передать экземпляр запроса логическим методам, и, поскольку вы используете warden, вы можете получить пользователя из 'request.env [' warden ']. User'.

У меня не было веской причины не использовать логические методы в качестве статических (собственных) методов модуля. Возможно, предложение Дмитрия подходит вам, но я предпочитаю «требовать», чем динамически включать одноразовые логические биты.

...