我一直在研究CMS应用程序,以提高我的技能,控制器变得非常臃肿的定义。我知道可以在lib / whatever.rb中存储东西,然后使用require和include,但这对控制器来说并不是很有用 - 至少在我的情况下,我有before_filters。 如果没有控制器中的定义,则before_filters拒绝工作。
所有的defs都要进入控制器还是有办法将它们取出? (它们特定于该控制器,因此无法进入应用程序控制器。
答案 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的自动加载路径中。