在方法中使用rails skip_before_filter(在运行其他before_filters之后)

时间:2013-01-15 02:30:17

标签: ruby-on-rails controller before-filter

在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,然后排除某些控制器模型,但我想知道是否有办法在不必更改的情况下执行此操作我的所有控制器。

2 个答案:

答案 0 :(得分: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之外还有一种方法可以使这适用于所有控制器,这对于各种控制器来说都是一个非常糟糕的主意。的原因。

答案 1 :(得分:0)

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