如何在routes.rb中触发before_actions?解决Sidekiq页面未触发问题
解决Sidekiq Web界面触发ApplicationController中before_actions的问题
原因
Sidekiq::Web是独立的Rack应用,它的控制器并不继承你的ApplicationController,所以你定义的before_action不会自动在访问Sidekiq页面时执行。
解决方案
可以通过将ApplicationController的before_action逻辑注入到Sidekiq::Web的控制器中来实现,具体有两种可行方式:
方式一:直接扩展Sidekiq::Web控制器
在项目的初始化文件(比如config/initializers/sidekiq.rb)中添加以下代码:
require 'sidekiq/web' # 给Sidekiq::Web控制器添加需要的before_action Sidekiq::Web.class_eval do before_action :authenticate_user! before_action :set_current_user! end
方式二:通过Rack中间件共享逻辑
如果你的认证或用户设置逻辑适合用中间件封装,也可以通过挂载中间件实现:
- 创建中间件文件
app/middlewares/shared_user_context_middleware.rb:
class SharedUserContextMiddleware def initialize(app) @app = app end def call(env) # 复制ApplicationController中authenticate_user!和set_current_user!的核心逻辑 # 注意:中间件环境下需手动处理请求上下文 request = ActionDispatch::Request.new(env) # 实现authenticate_user!逻辑示例 unless request.env['warden'].user return [302, { 'Location' => '/users/sign_in' }, []] end # 实现set_current_user!逻辑示例 Current.user = request.env['warden'].user @app.call(env) end end
- 在初始化文件
config/initializers/sidekiq.rb中挂载中间件:
require 'sidekiq/web' require_relative '../../app/middlewares/shared_user_context_middleware' Sidekiq::Web.use SharedUserContextMiddleware
注意事项
- 若路由中已通过
authenticate :user做了验证,需避免注入的before_action与现有逻辑冲突; - 确保
set_current_user!的逻辑在Sidekiq::Web的控制器环境中能正常运行,比如依赖的变量、方法都可访问。
内容的提问来源于stack exchange,提问作者Ymox
相关产品推荐
相关产品推荐

