2016-04-27 66 views
6

嗨,我正在爲應用程序構建一個API部分。我所有的api相關的控制器都駐留在app/controllers/api目錄中。skip_before_action在Rails中的幾個控制器?

我的問題是,在application_controller有一個過濾器before_action :authenticate_user!,所以我必須在登錄模式訪問api。

我目前的解決方案:我在所有這一切都在 app/controllers/api目錄控制器添加skip_before_action :authenticate_user! ..

問題:我在所有的控制器來寫,我有大約80個控制器

我的期望:有沒有一種方法,我可以在application_controller寫本身是這樣的 b efore_action:的authenticate_user!除了:[all the controllers which are in api directory]

+0

http://stackoverflow.com/a/11785449/2231236實現同樣 – Nithin

回答

2

你可以嘗試這樣的,如果所有的控制器是API文件夾下:

class ApplicationController < ActionController::Base 
    before_filter :authenticate! 


    def authenticate! 
    if params[:controller].split("/").first == "api" 
     return true # or put code for what wherever authenticate you use for api 
    else 
     authenticate_user! 
    end 
    end 
end 
+0

你肯定'PARAMS [ :controller]'包含路徑,而不僅僅是控制器的名稱? –

+1

@ArslanAli,是的,如果控制器被定義爲 class Api :: PasswordsController Thorin

7

你將不得不在每一個控制器,其行爲不應該被認證指定skip_before_action :authenticate_user!。您不能將控制器的名稱或類似的東西作爲參數傳遞給skip_before_action方法。

一種解決方案是:您可以創建一個名爲APIController控制器,你可以指定skip_before_action的事情出現了,如:

class APIController < ApplicationController 
    skip_before_action :authenticate_user! 
    # rest of the code 
end 

然後全部app/controllers/api/控制器可以從APIController繼承。

class OtherController < APIController 
end