2009-09-01 1 views
0

У меня есть класс Rails metal, который в основном делает однократную проверку, чтобы убедиться, что в системе есть пользователь admin, если нет, он перенаправляет пользователя на его создание. Сейчас я использую стойку сессию, чтобы предотвратить двойную проверку, но это, кажется, имеют следующие проблемы:Могу ли я «разгрузить» Rails Metal Class после одноразового использования?

  • Еще один делает проверку времени для каждой сессии
  • Замедляет вещи вниз, проверяя сессию в первую очередь ,

Интересно, возможно ли его перенаправить Rails для «удаления» или «выгрузки» класса из цепочки. Можно ли это сделать безопасно? Любые другие предложения?

ответ

2

Простейшее решение (хотя и не столь чистое) должно было бы сохранить тот факт, что пользователь-администратор существует в классе.

class EnsureAdminUser 
    def self.call(env) 
    if @admin_defined or Admin.any? 
     @admin_defined = true 
     [404, {"Content-Type" => "text/html"}, "Not Found"] 
    else 
     … 
    end 
    end 
end 

Это экономит ваше БД по каждому запросу.

Чтобы действительно удалить металл вам нужно будет сделать что-то более радикальное (и зло):

ObjectSpace.each_object(Rails::Rack::Metal){|metal_handler| 
    metal_handler.instance_eval{ @metals.delete(EnsureAdminUser) } 
} 
+0

Это похоже на определенное улучшение, так как я не полагаться на сессии для хранения. Я был под впечатлением, что металлические классы будут загружаться с нуля каждый запрос. Если это так, это, похоже, не быстрее. Неужели я ошибаюсь в этом предположении? –

+0

Глядя на источник (http://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/rack/metal.rb), металлы загружаются при запуске приложения. Я добавил еще один ответ с инструкциями о том, как его удалить. Но это плохая идея. – cwninja

+0

Исправление, вместо этого отредактированный оригинальный ответ. – cwninja

Смежные вопросы