2

我正在使用Rails Warden插件。它定义了一个返回当前用户的帮助方法“用户”。查看源代码的链接。

现在我有一个没有对控制器的任何引用的业务逻辑对象。但我想获得当前用户。有什么方法可以访问这个吗?

我试过了

ActionController::Base.helpers.user

甚至

RailsWarden::Mixins::HelperMethods.user

没有运气。谢谢。

4

2 回答 2

2

现在我有一个没有对控制器的任何引用的业务逻辑对象。但我想获得当前用户。有什么方法可以访问这个吗?

那么为什么不能将当前用户传递给这些方法呢?

此外,您可以将它们混合在一起。

我强烈反对你编写静态助手(它不是 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 上下文(我什至没有谈论测试它)。

于 2011-04-01T04:32:19.587 回答
0

我认为业务逻辑的方式,它位于控制器和模型之间。我认为将请求的实例传递给逻辑方法是可以的,并且由于您使用的是warden,因此您可以从'request.env ['warden'].user'中获取用户。

我没有遇到一个很好的理由不让逻辑方法成为模块的静态(自我)方法。也许 Dmytrii 的建议对您有用,但我更喜欢“要求”而不是动态包含一次性逻辑位。

于 2011-05-15T01:27:58.527 回答