【问题标题】:How to access Warden current user in business logic in Rails3如何在 Rails3 的业务逻辑中访问 Warden 当前用户
【发布时间】:2011-03-29 11:06:56
【问题描述】:

我正在使用Rails Warden 插件。它定义了一个返回当前用户的helper method'user'。源代码见链接。

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

我试过了

ActionController::Base.helpers.user

甚至

RailsWarden::Mixins::HelperMethods.user

没有运气。谢谢。

【问题讨论】:

标签: ruby ruby-on-rails-3 warden


【解决方案1】:

现在我有一个业务逻辑对象 没有任何参考 控制器。但我想 获取当前用户。有没有什么办法 访问这个?

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

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

我强烈建议您编写静态帮助程序(它不是 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 上下文(我什至没有谈论测试它)。

【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-02-22
    • 2012-04-25
    • 2021-10-04
    • 2017-08-08
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多