我想验证用户是否已登录到服务器的每个请求。
类似的东西:
:before_filter verify_logged_in
我应该把它放在哪个before_filter中,以便它适用于所有控制器操作和所有请求?
答案 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
,它就可以正常工作。