【问题标题】:Where should I put methods to be used by multiple controllers in rails?我应该将多个控制器使用的方法放在哪里?
【发布时间】:2013-09-22 17:51:24
【问题描述】:
我有一个管理控制器和视图来管理管理任务。其中许多任务与我的两个主要模型支持的控制器用户和材料中执行的任务非常相似。我正在尝试干掉我的代码,所以我想把它放在某个地方,但是在哪里呢?
例如:
作为管理员,我可以从我的管理员视图中删除材料,但用户也可以从他们的材料视图中删除。我在管理员和材料控制器中都有几乎相同的代码,唯一的例外是重定向到不同的地方。
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-3
helper
【解决方案1】:
Rails4 的方式是使用Concerns,即使有some discussion 正在处理它。尽管如此,我还是喜欢这种方法,尽管most of the material you find 更多的是关于模型而不是控制器。
一个简单的例子
如果您使用的是 Rails 3(正如您的标签所示),只需将 concerns-folder 添加到您的 controllers-folder 并将其添加到您的 autoload-path 中:
#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
诚然,这不是最好的用例,但它应该给你一个先机。
【解决方案2】:
如果AdminsController继承自UsersController,则可以将此类方法放在UsersController中,通过super之前的方法参数或控制器名称或代码来判断。
如果 Admin 和 User 没有继承关系,您可以创建一个单独的模块并让 Admin 和 User 都包含它。