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

问题描述 投票:0回答:5

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

类似:

:before_filter verify_logged_in

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

ruby ruby-on-rails-3 authentication redirect before-filter
5个回答
23
投票

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


10
投票

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

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

如果您点击

users
资源的 url,并执行任何操作(例如
index
操作),则:

控件首先转到

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

应用控制器:

class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :verify_logged_in

end

其他控制器:

class UsersController < ApplicationController

  def index

  end

在上面的代码中,您可以看到另一个控制器继承了父控制器(即应用程序控制器)的内容。因此,如果您将

before_filter
放入应用程序控制器中,那么对于每个用户,它将验证该用户是否针对每个请求登录。


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

祝你好运:-)


0
投票

将其放入

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


0
投票

如果您希望过滤器适用于所有操作,请将其放在 application_controller.rb 中

'类应用程序控制器< ActionController::Base

在_action之前:验证_用户

after_action:redirect_if_deleted

...................... 结束'

© www.soinside.com 2019 - 2024. All rights reserved.