如何使 Devise return 成为用户的子类
How to make Devise return a subclass of user
我设计了验证用户身份的方法。 User
被拆分为子class,例如User::AsProfile < User
或User::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 并在其中添加方法。从来都不是一个好主意。事后看来,设计应该只是一些模块(关注点),开发人员可以挑选并添加到他的控制器中。
我设计了验证用户身份的方法。 User
被拆分为子class,例如User::AsProfile < User
或User::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 并在其中添加方法。从来都不是一个好主意。事后看来,设计应该只是一些模块(关注点),开发人员可以挑选并添加到他的控制器中。