我假设在这里发生的是,你的应用程序中有一堆控制器实际上只是做同样的事情,所以你想利用继承来干掉它。
话虽如此,我并不完全确定 ApplicationController 是否是转储所有这些功能的正确位置,因为将来如果您有新的控制器,它们也将继承所有这些功能而不一定需要它。
我会做这样的事情:
- 假设你有这样的控制器:
- 狮子控制器.rb
- Tigers_controller.rb
- hippos_controller.rb
而且它们几乎具有相似的功能......我会创建一个“基础”控制器,然后在子控制器上设置继承。然后我还会做一个设置子控制器的“逻辑”默认值的操作,就像这样。
AnimalsController.rb
class AnimalsController < ApplicationController
class_attribute :resource_class, :parent_resource_class
protected
def self.set_resource_attributes(options={})
self.resource_class = options[:resource_class]
self.parent_resource_class = options[:parent_resource_class]
end
end
LionsController.rb
class LionsController < AnimalsController
#call methods in AnimalsController here, start with setting the resource name
set_resource_attributes :resource_class => Lion, :parent_resource_class => Animal
end
依此类推...可能有用的另一件事是使用“instance_variable_set”方法,以便您可以在视图中设置实际有意义的实例变量名称...您可以使用您刚刚设置的类变量...例如,让我们重新打开 AnimalsController.rb 类:
class AnimalsController < ApplicationController
def show
instance_variable_set("@#{self.resource_class.name.underscore}".to_sym, self.resource_class.find(params[:id]))
#... all the regular show stuff
end
end
这样,当您转到 lions#show 路径时,您将在视图中访问一个名为的变量,该变量@lion
将被设置并包含通过 ActiveRecord 找到的 Lion 类的实例。
当然,我在这里输入的这个伪代码可以被清理并干燥一点,但希望你能得到我想要的地方。希望这会有所帮助。