带有ActiveScaffold和Lockdown插件的Rails

时间:2009-12-23 16:11:38

标签: ruby-on-rails activescaffold lockdown

我们的应用程序是使用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 :(得分:0)

Lockdown仅在开发模式下重新配置init.rb,因此您无需重新启动应用程序即可进行更改。它会更慢 - 一个方便的权衡。好消息是Lockdown只能在生产模式下进行一次解析。

我不使用ActiveScaffold,所以我不能在那里提供任何帮助,但我认为这对你很感兴趣。