【发布时间】: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(不存在),我想是因为那是路由的前缀?如果它尝试调用AdminController 或AdminsController,我就不会那么惊讶了。
这真的让我感到困惑,因为我的应用程序中的其他命名空间都可以工作。例如,这很好用:
namespace :account do
resource :billing, :except => [:edit,:update]
resource :subscription
end
所以关于中间件和定义命名空间的根的某些东西导致了这个问题,老实说我完全不理解。
如果有人能解释这个中间件发生了什么,为什么它会与我的路由发生冲突,以及如何解决它,我将不胜感激。谢谢!
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 routing rack carrierwave