【问题标题】:How to make Devise return a subclass of user如何使设计返回用户的子类
【发布时间】:2023-03-20 04:53:01
【问题描述】:

我已经设计出对用户进行身份验证的方法。 User 被拆分为子类,例如 User::AsProfile < UserUser::AsRegistrant< User。这些不是单表继承类,只是从 User 继承的普通旧 ruby​​ 对象。

我希望设计的 current_user 助手返回 User::AsProfile 的实例。

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

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

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

【问题讨论】:

    标签: ruby-on-rails devise warden


    【解决方案1】:

    我最终在我的 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 的情况下才有可能。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    相关资源
    最近更新 更多