【问题标题】:Help with Rack middleware帮助 Rack 中间件
【发布时间】:2011-10-31 05:39:52
【问题描述】:

我有一个上传器,目前它包含一个 Flash 上传选项作为后备。为了让 flash 上传器工作,我必须使用这个中间件来保存会话 cookie。

我不了解有关机架或中间件的 bean,我从有关如何修复 Flash 上传的教程中复制此代码而不了解它的作用而感到内疚。代码如下:

require 'rack/utils'

class FlashSessionCookieMiddleware
  def initialize(app, session_key = '_session_id')
    @app = app
    @session_key = session_key
  end

  def call(env)
    if env['HTTP_USER_AGENT'] =~ /^(Adobe|Shockwave) Flash/
      req = Rack::Request.new(env)
      env['HTTP_COOKIE'] = [ @session_key, ::Rack::Utils.escape(req.params[@session_key]) ].join('=').freeze unless req.params[@session_key].nil?
      env['HTTP_ACCEPT'] = "#{req.params['_http_accept']}".freeze unless req.params['_http_accept'].nil?
    end

    @app.call(env)
  end
end

这会包含在会话存储初始化程序中:

#initializers/session_store.rb

Rails.application.config.middleware.insert_before(
    Rails.application.config.session_store,
    FlashSessionCookieMiddleware, 
    Rails.application.config.session_options[:key])

现在我遇到了一个问题:我正在设置一个管理员命名空间来对整个站点中的一组仅限管理员的控制器操作进行分组。我尝试做的第一件事是设置 admin 命名空间的根目录,如下所示:

namespace :admin do
  root :to => 'queues#index'
end

但这会在中间件中崩溃,并在服务器日志中显示以下错误消息:

ActionController::RoutingError (uninitialized constant Admin):
  app/uploaders/flash_session_cookie_middleware.rb:16:in `call'

所以,中间件(我不明白)正在尝试调用Admin(不存在),我想是因为那是路由的前缀?如果它尝试调用AdminControllerAdminsController,我就不会那么惊讶了。

这真的让我感到困惑,因为我的应用程序中的其他命名空间都可以工作。例如,这很好用:

namespace :account do
  resource :billing, :except => [:edit,:update]
  resource :subscription
end

所以关于中间件和定义命名空间的根的某些东西导致了这个问题,老实说我完全不理解。

如果有人能解释这个中间件发生了什么,为什么它会与我的路由发生冲突,以及如何解决它,我将不胜感激。谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 routing rack carrierwave


    【解决方案1】:

    现在有点问题,因为我以前遇到过这个问题,现在我试图在测试应用中重现它,我发现我做不到。

    但无论如何。该错误与中间件没有任何关系。碰巧闪存中间件中的包装#call 被内部发生的异常卡住了。

    我希望我能说出实际的问题是什么,但它可能与那个“Admin”模块命名空间有关。您是否尝试说“管理员”以查看更改为其他模块是否可以清除它?

    除了namespace :admin,您还可以使用scope "/admin",后者完成同样的事情,但不需要为控制器命名空间,这可能会解决您的问题。

    说到,我假设“队列”控制器位于名为“admin”的子文件夹中,命名空间为 Admin::QueuesController?

    【讨论】:

    • 好的,在您的帮助下,我想通了。我实际上打算将 admin 命名空间的根路由到现有的单独控制器操作(只是 QueuesController 而不是 Admin::QueuesController),但这是行不通的。我忘记了命名空间自动添加所有路径等。无论如何,你让我走上了正确的轨道。谢谢!
    • 啊!我想知道我会如何重现这个问题?使用范围管理员路由,而不使用同一个控制器?无论如何,很高兴你解决了它:-)
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多