如何干掉所有这些调用来渲染:index?

Ste*_*ngs 5 ruby-on-rails dry

我有一堆控制器,其方法可以呈现索引视图.这导致我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解决方案.

Pan*_*kos 4

如果你真的想干掉这个动作,并且它很常见,那么你可以自己做一些元编程。首先使用以下模块定义创建一个 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 调用来渲染任何操作。