帮助Rack中间件

时间:2011-08-20 14:31:01

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

我有一个上传器,目前包含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

因此,关于中间件和定义命名空间根的一些原因导致了这个问题,而我根本不理解这一点。

如果有人能够解释这个中间件发生了什么,为什么它会导致我的路由冲突,以及如何修复它,我将非常感激。谢谢!

1 个答案:

答案 0 :(得分:1)

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

但无论如何。该错误与中间件无关。只是碰巧闪存中间件中的包裹#call陷入了内部发生的异常。

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

而不是namespace :admin,你也可以使用scope "/admin",后者完成同样的事情而不需要命名控制器,这可能会解决你的问题。

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