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

slmsl1lt  于 2023-10-17  发布在  Ruby
关注(0)|答案(5)|浏览(99)

我想验证用户是否在每次请求服务器时都登录。
例如:

:before_filter verify_logged_in

我应该把它放在_filter之前的哪里,这样它就可以应用于所有的控制器操作和所有的请求了?

yh2wf1be

yh2wf1be1#

要确保筛选器适用于所有操作,请将其放置在application_software. rb中。

goqiplq2

goqiplq22#

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放在应用程序控制器中,那么对于每个用户,它都会验证用户是否在每个请求中登录。

mefy6pfw

mefy6pfw3#

将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

祝你好运:-)

jq6vz3qz

jq6vz3qz4#

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

zaqlnxep

zaqlnxep5#

如果你希望过滤器应用于所有的动作,把它放在你的应用程序控制器继承的控制器中。(默认值为ApplicationController

class ApplicationController < ActionController::Base
  before_action :authenticate_user 
  after_action :redirect_if_deleted
  
  # [...]
end

相关问题