Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在何处放置多个控制器之间共享的前\u过滤器_Ruby_Ruby On Rails 3_Module_Before Filter - Fatal编程技术网

Ruby 在何处放置多个控制器之间共享的前\u过滤器

Ruby 在何处放置多个控制器之间共享的前\u过滤器,ruby,ruby-on-rails-3,module,before-filter,Ruby,Ruby On Rails 3,Module,Before Filter,我有多个控制器,它们都使用相同的before\u过滤器。为了保持干燥,这种方法应该在哪里使用,以便所有控制器都可以使用它?模块似乎不是合适的地方,尽管我不知道为什么。我不能将它放在基类中,因为控制器已经有了不同的超类。如果它对所有控制器都是通用的,您可以将它放在应用程序控制器中。如果没有,您可以创建一个新的控制器,使其成为所有控制器的超类,并将代码放入其中。类似的操作可以完成 Class CommonController < ApplicationController # before

我有多个控制器,它们都使用相同的before\u过滤器。为了保持干燥,这种方法应该在哪里使用,以便所有控制器都可以使用它?模块似乎不是合适的地方,尽管我不知道为什么。我不能将它放在基类中,因为控制器已经有了不同的超类。

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

类似的操作可以完成

Class CommonController < ApplicationController
  # before_filter goes here
end

Class MyController < CommonController
end

class MyOtherController < CommonController
end
Class CommonController
置于控制器的共享超类中的过滤器之前。如果您必须在继承链中走得太远,以至于这最终成为
ApplicationController
,并且您被迫将
before\u filter
应用于某些不应应用的控制器,那么您应该在这些特定控制器中使用
skip\u before\u filter

class ApplicationController < ActionController::Base
  before_filter :require_user
end

# Login controller shouldn't require a user
class LoginController < ApplicationController
  skip_before_filter :require_user
end

# Posts requires a user
class PostsController < ApplicationController

end

# Comments requires a user
class CommentsController < ApplicationController

end
class ApplicationController
将前置过滤器和方法放在一个模块中,并将其包含在每个控制器中如何。我会把这个文件放在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

一个模块似乎不是合适的地方。为什么不呢?@1ndivisible你应该接受下面沃森的回答。你是对的。我的控制器有不同的超类,所以这不是一个选项。我更喜欢@KulbirSaini的方法,这样不仅在过滤器之前,我还可以设置布局。当然,如果您的控制器有不同的超类,那么模块方法将是最佳选择,但这感觉是错误的。我有12个控制器,其中4个使用这个前置过滤器。这是一个很大的跳过之前,在其他过滤器。然后你就没有其他选择了。将方法和
放在模块中的\u filter
之前。足够公平。我只是想看看我是否遗漏了一些明显的东西。我以前没有见过skip_before_filter,谢谢。如果模块中的filter方法不是面向公众的,请不要忘记将其设置为受保护的。
config.autoload_paths += %W(#{config.root}/lib)