如何使 Devise return 成为用户的子类

How to make Devise return a subclass of user

我设计了验证用户身份的方法。 User 被拆分为子class,例如User::AsProfile < UserUser::AsRegistrant< User。这些是不是单一Table继承classes,只是普通的旧ruby-从用户继承的对象。

我想设计 current_user 助手来 return User::AsProfile 的一个实例。

不幸的是,Device 在 class_eval 中隐藏了很多元编程,所以很难理解发生了什么。

当控制器中 运行 current_user 时,我可以将 Devise 配置为 return 另一个 class (User::AsProfile) 吗?

或者我必须在我的控制器中覆盖 current_user 才能这样做,如果是这样,我应该如何调用 warden 来正确验证?

我最终在我的 ApplicationController 中重新实现了 current_user

因为我不需要让一个用户使用多个会话的能力,所以我可以大大简化 current_user

class ApplicationController < ActionController::Base
  def current_user
    return @current_user if @current_user
    current = warden.authenticate(scope: :user)
    @current_user = current.becomes(User::AsProfile) if current
  end
end

通过使用 ActiveRecords becomes,用户变成了 User::AsProfile。我宁愿不进行这种转换并直接使用 User::AsProfile#find,但这似乎只有通过 monkeypatching Warden 才有可能。

作为旁注:这个问题很好地说明了当库实现设计不佳的 class-继承时会发生什么;或者,在这种情况下,根本没有继承。 Devise 代码只是猴子修补 your ApplicationController 并在其中添加方法。从来都不是一个好主意。事后看来,设计应该只是一些模块(关注点),开发人员可以挑选并添加到他的控制器中。