我有一堆控制器,其方法可以呈现索引视图。这导致我在大多数方法的末尾写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
理想情况下,我只是将渲染代码移动到后置滤镜中,但是当控制器调用渲染之后再转到后面的滤镜,这不是一个选项。
我有很多像这样的控制器,所以解决方案会删除大量重复的代码。
此应用程序目前仍为Rails 2.3,但是,它将在下个月或两个月升级到Rails 3。因此,虽然我更喜欢一种适用于2.3的技术,但Rails 3仍然只能使用Rails解决方案。
答案 0 :(得分:4)
如果你真的想要干掉这个动作,如果它非常普遍,那么你可以做一些你自己的元编程。首先使用此模块定义创建render_with_index.rb文件:
module RenderWithIndex def self.included klass klass.class_eval do def self.render_with_index * methods methods.each do |method| self.class_eval <<-EVAL alias :old_method :#{method} def #{method} old_method render :index end EVAL end end end end end
然后在控制器中包含该模块并定义应使用index呈现的方法(确保在方法声明之后发生render_with_index调用。
include RenderWithIndex def index @models = Model.find(:all) end def new_models @models = Model.find_by_new(true) end def old_models @models = Model.find_by_new(false) end render_with_index :new_models, :old_models
此模块现在允许您使用索引模板呈现任何操作,只需将其添加到render_with_index调用即可。
答案 1 :(得分:2)
看起来很干我。恕我直言,如果您不想使用特定于控制器方法的模板,那么提及您正在渲染的模板是一个很好的习惯。
如果您的渲染代码从一行代码扩展到几行代码,我会将它们分解为单独的渲染方法。