如何将before_filter应用于Rails 3.2.11中每个控制器的每个动作?

时间:2013-02-07 13:34:09

标签: ruby ruby-on-rails-3 authentication redirect before-filter

我想验证用户是否已登录到服务器的每个请求。

类似的东西:

:before_filter verify_logged_in

我应该把它放在哪个before_filter中,以便它适用于所有控制器操作和所有请求?

4 个答案:

答案 0 :(得分:23)

要确保过滤器适用于所有操作,请将其放在application_controller.rb中。

答案 1 :(得分:10)

Application Controller是所有其他类的基类。

如果您在此类中放置任何过滤器,则流程的工作方式如下:

如果您点击了users资源的网址,并且有index行动,请执行以下操作:

控件首先转到Application Controller。在那里它检查过滤器,如果找到任何它然后它执行过滤器方法,然后它转到用户控制器的索引操作。

应用程序控制器:

class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :verify_logged_in

end

其他控制器:

class UsersController < ApplicationController

  def index

  end

在上面的代码中,您会看到另一个控制器正在继承作为应用程序控制器的父控制器的内容。因此,如果您将before_filter放在应用程序控制器中,那么对于每个用户,它将验证用户是否已针对每个请求登录。

答案 2 :(得分:4)

将before_filter放在基类中(在application_controller.rb文件中),它将在base及其所有派生类上工作,例如

class ApplicationController < ActionController::Base
  before_filter :set_locale

  def set_locale
    I18n.locale = params[:locale] or I18n.default_locale
  end
end
祝你好运: - )

答案 3 :(得分:0)

将其放在ApplicationController中并继承其中的所有其他控制器。如果您没有覆盖其中一个子控制器中的verify_logged_in,它就可以正常工作。