ruby-on-rails - 我怎样才能干掉所有这些调用来渲染 :index?

标签 ruby-on-rails dry

我有一堆带有呈现索引 View 的方法的 Controller 。这导致我写 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

理想情况下,我只是将渲染代码移动到后过滤器中,但由于 Controller 在进入后过滤器之前调用渲染,这不是一个选项。

我有大量这样的 Controller ,因此解决方案将删除大量重复代码。

这个应用程序目前仍然是 Rails 2.3,但是,它将在接下来的一两个月内升级到 Rails 3。因此,虽然我更喜欢适用于 2.3 的技术,但仍会赞赏 Rails 3 唯一的解决方案。

最佳答案

如果你真的想干掉这个 Action ,如果它很常见,那么你可以自己做一些元编程。首先使用此模块定义创建一个 render_with_index.rb 文件:

模块 RenderWithIndex
def self.included 类
类.class_eval 做
def self.render_with_index * 方法
methods.each 做 |方法|
self.class_eval <<-EVAL
别名 :old_method :#{method}

def#{方法}
旧方法
渲染:索引
结尾
评估
结尾
结尾
结尾
结尾
结尾

然后将该模块包含在您的 Controller 中并定义应该使用索引呈现的方法(确保在您的方法声明之后发生 render_with_index 调用。

包括 RenderWithIndex

定义索引
@models = Model.find(:all)
结尾

def new_models
@models = Model.find_by_new(true)
结尾

def old_models
@models = Model.find_by_new(false)
结尾

render_with_index :new_models, :old_models

该模块现在允许您通过将索引模板添加到 render_with_index 调用来渲染任何操作。

关于ruby-on-rails - 我怎样才能干掉所有这些调用来渲染 :index?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4850329/

相关文章:

ruby-on-rails - Rails 4 - 有没有办法压缩大图像以使其加载速度更快?

ruby-on-rails - 我可以从刚刚定义的模型代码中调用命名范围吗?

javascript - 如何保持 C# 和 Javascript 代码同步?

c# - 当我需要为所有表单重载方法时如何保持 DRY?

python - 显式与 DRY - 哪种方式更 pythonic?

controller - 在菲尼克斯干燥 Controller

ruby-on-rails - Rails 中的装饰器与助手?

ruby-on-rails - Google Chrome浏览器未缓存图像

ruby-on-rails - rails 4 : Capistrano development environment instead of production?

javascript - 我怎样才能 "DRY"我的html和javascript代码?