Теперь у меня есть объект бизнес-логики, который не имеет никакой ссылки на контроллер.Но я бы хотел получить текущего пользователя.Есть ли какой-нибудь способ получить доступ к этому?
Так почему же вы не можете просто передать текущего пользователя этим методам?
Кроме того, вы можете смешать их.
Я настоятельно не рекомендую вам писать статические помощники (это не 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-контексту в ваших бизнес-объектах (я даже не говорю о его тестировании).