我正在使用Rails Warden插件。它定义了一个返回当前用户的帮助方法“用户”。查看源代码的链接。
现在我有一个没有对控制器的任何引用的业务逻辑对象。但我想获得当前用户。有什么方法可以访问这个吗?
我试过了
ActionController::Base.helpers.user
甚至
RailsWarden::Mixins::HelperMethods.user
没有运气。谢谢。
我正在使用Rails Warden插件。它定义了一个返回当前用户的帮助方法“用户”。查看源代码的链接。
现在我有一个没有对控制器的任何引用的业务逻辑对象。但我想获得当前用户。有什么方法可以访问这个吗?
我试过了
ActionController::Base.helpers.user
甚至
RailsWarden::Mixins::HelperMethods.user
没有运气。谢谢。
现在我有一个没有对控制器的任何引用的业务逻辑对象。但我想获得当前用户。有什么方法可以访问这个吗?
那么为什么不能将当前用户传递给这些方法呢?
此外,您可以将它们混合在一起。
我强烈反对你编写静态助手(它不是 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 上下文(我什至没有谈论测试它)。
我认为业务逻辑的方式,它位于控制器和模型之间。我认为将请求的实例传递给逻辑方法是可以的,并且由于您使用的是warden,因此您可以从'request.env ['warden'].user'中获取用户。
我没有遇到一个很好的理由不让逻辑方法成为模块的静态(自我)方法。也许 Dmytrii 的建议对您有用,但我更喜欢“要求”而不是动态包含一次性逻辑位。