在多个控制器之间共享before_filter的位置

时间:2012-08-13 18:34:00

标签: ruby ruby-on-rails-3 module before-filter

我有多个控制器都使用相同的before_filter。为了保持干燥,这种方法应该放在哪里,以便所有控制器都可以使用它?一个模块似乎不是正确的地方,虽然我不知道为什么。我不能把它放在基类中,因为控制器已经有不同的超类。

4 个答案:

答案 0 :(得分:28)

如何将您的before_filter和方法放在模块中并将其包含在每个控制器中。我把这个文件放在lib文件夹中。

module MyFunctions

  def self.included(base)
    base.before_filter :my_before_filter
  end

  def my_before_filter
    Rails.logger.info "********** YEA I WAS CALLED ***************"
  end
end

然后在您的控制器中,您所要做的就是

class MyController < ActionController::Base
  include MyFunctions
end

最后,我会确保lib是自动加载的。打开config / application.rb并将以下内容添加到您的应用程序的类中。

config.autoload_paths += %W(#{config.root}/lib)

答案 1 :(得分:4)

这样的事情可以做到。

Class CommonController < ApplicationController
  # before_filter goes here
end

Class MyController < CommonController
end

class MyOtherController < CommonController
end

答案 2 :(得分:3)

before_filter放在控制器的共享超类中。如果你必须走得最远的继承链ApplicationController,并且你被迫将before_filter应用于它不应用的某些控制器,你应该使用{{1在那些特定的控制器中:

skip_before_filter

答案 3 :(得分:0)

如果所有控制器都通用,您可以将其放在应用程序控制器中。如果没有,你可以创建一个新的控制器并使其成为所有控制器的超类,并将代码放入其中。