我有一个上传器,目前包含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
(不存在),我想是因为这是路由的前缀?如果它试图致电AdminController
或AdminsController
,我会感到很惊讶。
这真让我感到困惑,因为我的应用程序中的其他命名空间有效。例如,这很好用:
namespace :account do
resource :billing, :except => [:edit,:update]
resource :subscription
end
因此,关于中间件和定义命名空间根的一些原因导致了这个问题,而我根本不理解这一点。
如果有人能够解释这个中间件发生了什么,为什么它会导致我的路由冲突,以及如何修复它,我将非常感激。谢谢!
答案 0 :(得分:1)
有点故障,因为我以前遇到过这个问题,现在我正试图在测试应用程序中重现它,我发现我做不到。
但无论如何。该错误与中间件无关。只是碰巧闪存中间件中的包裹#call
陷入了内部发生的异常。
我希望我能说出实际问题是什么,但它可能与“Admin”模块命名空间有关。您是否尝试过说“管理员”以查看更改为其他模块是否会将其清除?
而不是namespace :admin
,你也可以使用scope "/admin"
,后者完成同样的事情而不需要命名控制器,这可能会解决你的问题。
说到,我假设'队列'控制器位于名为“admin”的子文件夹中,并且命名空间为Admin::QueuesController
?