You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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中间件共享逻辑

如果你的认证或用户设置逻辑适合用中间件封装,也可以通过挂载中间件实现:

  1. 创建中间件文件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
  1. 在初始化文件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:16:09