Рельсы с плагинами ActiveScaffold и Lockdown - PullRequest
0 голосов
/ 23 декабря 2009

Наше приложение разработано с использованием Rails 2.3.5 вместе с ActiveScaffold. ActiveScaffold добавляет немного магии во время выполнения, просто объявив в контроллере следующее:

class SomeController < ApplicationController
 active_scaffold :model
end

Просто добавив эту одну строку в контроллере, все остальные действия и их соответствующие представления становятся доступными благодаря метапрограммированию ActiveScaffold. Поскольку большая часть кода добавляется во время выполнения, запросы в режиме разработки, кажется, немного медленнее, поскольку отсутствует class_caching.

Нам нужно было добавить слой авторизации, и моя команда выбрала плагин Lockdown, который анализирует файл init.rb, где вы объявляете все правила авторизации. Lockdown хранит правила авторизации путем анализа файла init.rb и оценки контроллеров, объявленных в файле init.rb. Таким образом, для каждого запроса Lockdown оценивает все контроллеры, вынуждая ActiveScaffold добавить множество метапрограммирования, которое, в свою очередь, выполняет db-запросы для определения определений столбцов каждой модели. Это значительно замедляет запрос в разработке, так как отсутствует class_caching. Несколько раз запрашивающие занимают почти 30-45 секунд.

Есть ли способ заставить ActiveScaffold сделать свое волшебство в before_filter? Примерно так:

class SomeController < ApplicationController
 before_filter :init_active_scaffold
 private
   def init_active_scaffold
     self.class_eval do
       active_scaffold :model
     end
   end
end

class SomeController < ApplicationController
 before_filter :init_active_scaffold
 private
   def init_active_scaffold
     self.instance_eval do
       active_scaffold :model
     end
   end
end

class SomeController < ApplicationController
 before_filter :init_active_scaffold
 private
   def init_active_scaffold
     self.class.class_eval do
       active_scaffold :model
     end
   end
end

class SomeController < ApplicationController
 before_filter :init_active_scaffold
 private
   def init_active_scaffold
     self.class.instance_eval do
       active_scaffold :model
     end
   end
end

Я перепробовал все вышеперечисленные четыре варианта, когда я делаю запрос, браузер, кажется, показывает индикатор загрузки, но ничего не происходит.

Любая помощь приветствуется. Заранее спасибо.

1 Ответ

0 голосов
/ 02 января 2010

При блокировке выполняется только повторная обработка init.rb в режиме разработки, чтобы вы могли вносить изменения без перезапуска приложения. Это будет медленнее - удобство компромисса. Хорошей новостью является то, что Lockdown будет выполнять этот анализ только один раз в производственном режиме.

Я не использую ActiveScaffold, поэтому не могу предложить там никакой помощи, но подумал, что это вас заинтересует.

...