我有一堆控制器,其方法可以呈现索引视图.这导致我render :index在大多数方法结束时写作.这是一个例子
def index
@models = Model.find(:all)
end
def new_models
@models = Model.find_by_new(true)
render :index
end
def old_models
@models = Model.find_by_new(false)
render :index
end
Run Code Online (Sandbox Code Playgroud)
理想情况下,我只是将渲染代码移动到后置滤镜中,但是在进入后置滤镜之前,控制器会调用渲染,而不是选项.
我有这么多的控制器,所以一个解决方案将删除大量重复的代码.
这个应用程序目前仍然是Rails 2.3,但是,它将在下个月或两个月升级到Rails 3.因此,虽然我更喜欢一种适用于2.3的技术,但Rails 3仍然只能使用Rails解决方案.
如果你真的想干掉这个动作,并且它很常见,那么你可以自己做一些元编程。首先使用以下模块定义创建一个 render_with_index.rb 文件:
带索引渲染模块
def 自包含类
klass.class_eval 做
def self.render_with_index * 方法
methods.each 执行 |method|
self.class_eval <<-EVAL
别名:old_method:#{方法}
def #{方法}
旧方法
渲染:索引
结尾
评估
结尾
结尾
结尾
结尾
结尾
然后将该模块包含在控制器中,并定义应使用索引渲染的方法(确保 render_with_index 调用发生在方法声明之后。
包括带有索引的渲染 定义索引 @models = Model.find(:all) 结尾 def 新模型 @models = Model.find_by_new(true) 结尾 def 旧模型 @models = Model.find_by_new(false) 结尾 render_with_index :新模型,:旧模型
该模块现在允许您通过将索引模板添加到 render_with_index 调用来渲染任何操作。