0

在 application_controller.rb 我有以下内容:

before_filter :get_events
before_filter :get_sitemap
def login_required
    return true if session[:user]
    # If we get to this point, I want to avoid running get_events and get_sitemap
    flash[:warning] = 'Please login to continue'
    redirect_to login_users_url
    return false 
end

在其他控制器中,例如:

before_filter :login_required, :except => [:show]

所以基本上我有运行方法来访问所有页面的数据库,除了我不希望它在用户需要登录时发生(即,从通常需要 get_events 和 get_sitemap 的页面重定向)。

我意识到这样做的一种方法是在设置任何其他 before_filters 之前在所有控制器上运行 login_required 作为 before_filter,然后排除某些控制器模型,但我想知道是否有一种方法可以做到这一点而不必更改我的所有控制器.

4

2 回答 2

4

对于这样的事情,我通常会创建一个AuthenticatedController(在 app/controllers/authenticated_controller.rb 中):

class AuthenticatedController < ApplicationController

  before_filter :require_login

end

然后,我从中派生所有需要身份验证的控制器,skip_before_filter :require_login为我要逐个控制器排除的操作指定一个。例如:

class PlanetsController < AuthenticatedController

  skip_before_filter :require_login, only: [:index]

end

这将要求您更改所有控制器,但仅出于从AuthenticatedController. 据我所知,这是一种完全可以接受的处理方式,而且我认为除了猴子修补 ActionController::Base 之外没有其他方法可以使其适用于所有控制器,这对于各种原因。

于 2013-01-15T02:35:30.257 回答
0

好吧,在考虑了约书亚的回答之后,我仍然无法得到我想要的东西......所以我所做的就是做一个小混合解决方案。所有控制器仍然引用 ApplicationController,但在 ApplicationController 中,我总是before_filter :login_required在其他 before_filters 之前运行 FIRST。rails 中的重定向似乎会阻止其他 before_filters 运行,这正是我想要的。在其他控制器中,我skip_before_filter :login_required, :only => [:this_time]在必要时使用。

于 2013-01-15T03:38:52.923 回答