为什么无需引入模块即可在Rails控制器中使用Devise的current_user等方法?
Devise 无需手动引入即可直接调用认证方法的原理
这是Rails框架的自动扩展机制和Devise的初始化逻辑共同作用的结果,核心原理如下:
- 第一是基于Rails的
ActiveSupport.on_load钩子机制,它允许第三方gem在指定的Rails核心组件加载完成后自动执行扩展逻辑,无需开发者手动修改核心代码或者手动引入模块。Devise在应用启动的初始化阶段就会监听action_controller_base的加载事件,当Rails加载完ActionController::Base之后,Devise会自动把辅助方法模块混入(include)到ActionController::Base中。 - 第二是基于Ruby的类继承特性,你的应用的
ApplicationController默认继承自ActionController::Base,父类已经混入了对应的辅助方法模块,子类自然就继承了所有这些公开方法,所以你可以直接在ApplicationController或者其他继承自它的业务控制器中直接调用authenticate_user!、current_user这类方法。
补充说明:这些方法不是提前硬编码写死的,Devise会读取你项目中配置的可认证模型(比如默认的User模型,或者你自定义的Admin、Member等模型),动态生成对应前缀的辅助方法,比如你配置了Admin模型支持Devise认证,就会自动生成authenticate_admin!、current_admin等对应的方法,无需额外配置。
Devise内部的注入逻辑示意:
# Devise 内部初始化逻辑 ActiveSupport.on_load :action_controller_base do # 自动混入辅助方法模块 include Devise::Controllers::Helpers end
你的应用控制器天然可以直接调用继承来的方法:
class ApplicationController < ActionController::Base # 直接调用继承来的方法作为过滤器 before_action :authenticate_user! end
内容的提问来源于stack exchange,提问作者Shun.Tagami
相关产品推荐
相关产品推荐

