我有一个管理员控制器和视图来管理管理任务。其中许多任务与我的两个主要模型支持的控制器“用户和材料”中执行的任务非常相似。我正试图干掉我的代码,所以我想把它放在某个地方,但在哪里?
例如:
作为管理员,我可以从管理员视图中删除材料,但用户也可以从他们的材料视图中删除。我在管理员和材料控制器中都有相同的代码,唯一的例外是重定向到了不同的地方。
答案 0 :(得分:2)
Rails4方式是使用Concerns,即使some discussion正在进行中。尽管如此,我仍然喜欢这种方法,尽管most of the material you find更多地是关于模型而不是控制器。
如果您使用的是Rails 3(如标记所示),只需将concerns
- 文件夹添加到controllers
- 文件夹中,然后将其添加到自动加载路径中:
#config/application.rb
config.autoload_paths += %W(#{config.root}/app/controllers/concerns)
例如,我在app/controllers/concerns/can_can_sanitizer.rb
module CanCanSanitizer
extend ActiveSupport::Concern
included do
before_filter do
resource = controller_path.singularize.gsub('/', '_').to_sym
method = "#{resource}_params"
params[resource] &&= send(method) if respond_to?(method, true)
end
end
end
我将其包含在我的application_controller中,就像任何其他模块一样:
include CanCanSanitizer
诚然,不是最好的用例,但它应该给你一个开头。
答案 1 :(得分:1)
如果AdminsController继承自UsersController,您可以将这些方法放在UsersController中,在super
之前判断与方法参数或控制器名称或代码的区别。
如果管理员和用户没有继承,您可以创建一个单独的模块,同时让Admin和User包含它。