2013-01-15 42 views
0

在application_controller.rb我有以下:導軌skip_before_filter方法中(其他before_filters已經運行之後)

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,然後排除某些控制器模型,但我想知道是否有辦法做到這一點,而無需改變我的所有控制器。

回答

0

考慮到約書亞的回答,我仍然無法得到我想要去的......所以我做的是做一個小混合解決方案。所有的控制器仍然引用ApplicationController,但是在ApplicationController中,我總是在其他before_filters之前運行before_filter :login_required FIRST。重定向軌道似乎阻止其他before_filters運行,這是我想要的。在其他控制器中,我會根據需要使用skip_before_filter :login_required, :only => [:this_time]

+0

究竟:only => [:this_time]選項是做什麼的? – Ameen

+0

:this_time不是一個真正的方法;我只是把它寫成'僞代碼'。您可以使用控制器操作的方法名稱來跳過登錄...... so [:create,:update ...]等等等等。 – JakeTheSnake

4

這樣的事情,我通常會創建一個AuthenticatedController(在應用程序/控制器/ 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的問題,它可以適用於所有的控制器,這對於各種各樣的原因。

+0

我該怎麼做?我試過類AuthenticationController JakeTheSnake

+0

你把它放在文件app/controllers/authentication_controller.rb? –

+0

用示例代碼更新了我的答案。 –

相關問題