Rails 3 - 如何组织/拆分臃肿的控制器?

时间:2011-06-07 20:16:45

标签: ruby-on-rails ruby organization

我一直在研究CMS应用程序,以提高我的技能,控制器变得非常臃肿的定义。我知道可以在lib / whatever.rb中存储东西,然后使用require和include,但这对控制器来说并不是很有用 - 至少在我的情况下,我有before_filters。 如果没有控制器中的定义,则before_filters拒绝工作。

所有的defs都要进入控制器还是有办法将它们取出? (它们特定于该控制器,因此无法进入应用程序控制器。

2 个答案:

答案 0 :(得分:2)

您可以使用mixin模块执行很多操作,这些模块将向现有控制器添加行为,或者您可以尝试创建一个类层次结构,允许控制器从其父类继承所需的方法。

在大多数应用程序中,我至少对子类ApplicationController进行一次,以便在某些上下文中强制执行某些标准。例如,与项目相关的所有控制器都将继承自ProjectController::Base

class ProjectController::Base < ApplicationController
  before_filter :must_be_logged_in
  before_filter :load_project

protected
  def load_project
    @project = Project.find(params[:project_id] || params[:id])

  rescue ActiveRecord::RecordNotFound
    render(:template => 'not_found')
  end

  def must_be_logged_in
    # ...
  end
end

答案 1 :(得分:0)

augmentation-plugin(它只是一个片段)可能是您的解决方案。

它的作用(向对象/模块添加一些方法)

class ::Object
  def self.augment(*mods)
    include *mods
    mods.each {|mod| class_eval &mod.augmentation }
  end
end

class ::Module
  def augmentation(&block)
    @augmentation ||= block
  end
end

它允许你做什么

# app/controllers/your_controller.rb
class YourController
  augment YourController::Stuff

  ...
end

# app/controllers/your_controller/stuff.rb
module YourController::Stuff
  augmentation do
    before_filter :something

    def something
      ...
    end
  end
end

您需要确保/app中的文件夹子文件夹包含在Rails的自动加载路径中。