2

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

例如:

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

4

2 回答 2

2

Rails4 的方式是使用Concerns,尽管有一些关于它的讨论。尽管如此,我还是喜欢这种方法,尽管您找到的大部分材料更多地是关于模型而不是控制器。

一个简单的例子

如果您使用的是 Rails 3(正如您的标签所暗示的那样),只需将concerns-folder 添加到您的controllers-folder 并将其添加到您的自动加载路径中:

#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

诚然,这不是最好的用例,但它应该给你一个先机。

于 2013-09-22T18:04:40.240 回答
1

如果 AdminsController 是继承自 UsersController 的,则可以将此类方法放在 UsersController 中,从方法参数或控制器名称或之前的代码来判断super

如果 Admin 和 User 没有继承关系,您可以创建一个单独的模块并让 Admin 和 User 都包含它。

于 2013-09-22T18:04:31.437 回答