12

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

就像是:

:before_filter verify_logged_in

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

4

4 回答 4

23

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

于 2013-02-07T13:36:36.200 回答
10

应用程序控制器是所有其他类的基类。

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

如果你users用任何动作点击资源的url sayindex动作然后:

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

应用控制器:

class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :verify_logged_in

end

其他控制器:

class UsersController < ApplicationController

  def index

  end

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

于 2013-02-07T14:21:45.773 回答
4

将 before_filter 放在基类中(在 application_controller.rb 文件中),它将适用于基类及其所有派生类,例如

class ApplicationController < ActionController::Base
  before_filter :set_locale

  def set_locale
    I18n.locale = params[:locale] or I18n.default_locale
  end
end

祝你好运 :-)

于 2013-02-07T17:03:54.247 回答
0

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

于 2013-02-07T13:37:16.380 回答