我应该在哪里放置多个控制器在轨道中使用的方法?

时间:2013-09-22 17:51:25

标签: ruby-on-rails ruby-on-rails-3 helper

我有一个管理员控制器和视图来管理管理任务。其中许多任务与我的两个主要模型支持的控制器“用户和材料”中执行的任务非常相似。我正试图干掉我的代码,所以我想把它放在某个地方,但在哪里?

例如:

作为管理员,我可以从管理员视图中删除材料,但用户也可以从他们的材料视图中删除。我在管理员和材料控制器中都有相同的代码,唯一的例外是重定向到了不同的地方。

2 个答案:

答案 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包含它。