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

时间:2011-01-31 11:27:16

标签: 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

理想情况下,我只是将渲染代码移动到后置滤镜中,但是当控制器调用渲染之后再转到后面的滤镜,这不是一个选项。

我有很多像这样的控制器,所以解决方案会删除大量重复的代码。

此应用程序目前仍为Rails 2.3,但是,它将在下个月或两个月升级到Rails 3。因此,虽然我更喜欢一种适用于2.3的技术,但Rails 3仍然只能使用Rails解决方案。

2 个答案:

答案 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)

看起来很干我。恕我直言,如果您不想使用特定于控制器方法的模板,那么提及您正在渲染的模板是一个很好的习惯。

如果您的渲染代码从一行代码扩展到几行代码,我会将它们分解为单独的渲染方法。