Помогите с Rack Middleware - PullRequest
       6

Помогите с Rack Middleware

0 голосов
/ 20 августа 2011

У меня есть загрузчик, который на данный момент включает опцию загрузки Flash как запасной вариант.Чтобы заставить загрузчик флэш-памяти работать, я должен использовать это промежуточное программное обеспечение для сохранения cookie-файлов сеанса.

Я не знаю bean-компонентов о стойке или промежуточном программном обеспечении, я виновен в том, что скопировал этот код из учебника покак исправить загрузку флэш-памяти, не понимая, что он делает.Вот код:

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])

Теперь я столкнулся с проблемой: я настраиваю пространство имен администратора для группыкуча действий только для администратора по всему сайту.Первое, что я попытался сделать, это настроить корень пространства имен администратора, например так:

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

Так что что-то в промежуточном программном обеспечении и определении корня пространства имен вызывает эту проблему, и я не понимаю этого, если честно.

Если бы кто-нибудь мог объяснить, что происходит с этим промежуточным программным обеспечением, почему он вызывает конфликт с моей маршрутизацией и как это исправить, я был бы очень признателен.Спасибо!

1 Ответ

1 голос
/ 21 августа 2011

Какая-то ошибка, потому что у меня уже была эта проблема, и теперь, когда я пытаюсь воспроизвести ее в тестовом приложении, я обнаружил, что не могу.

Но все равно.Ошибка не имеет ничего общего с промежуточным программным обеспечением.Просто случается, что обертка #call в промежуточном программном обеспечении флэш-памяти застревает, за исключением того, что происходит внутри.

Хотелось бы мне сказать, какова реальная проблема, но это, вероятно, связано с этимАдмин "пространство имен модуля.Вы пытались сказать «Администратор», чтобы увидеть, очищает ли его переход на другой модуль?

Вместо namespace :admin вы также можете использовать scope "/admin", последний выполняет то же самое, за исключением необходимостипространство имен контроллера, которое, вероятно, решит вашу проблему.

Кстати, я предполагаю, что контроллер 'queues' находится в подпапке с именем "admin" и пространством имен Admin::QueuesController?

...