2017-08-30 19 views
1

在下面的代碼中,爲什麼foo_enabled?要求EmployeeController.bar何時在Rails應用程序中執行條件before_action方法?

class ApplicationController < ActionControlelr::Base 
    before_action :foo, if: :foo_enabled? 
    def foo 
     puts 'foo called' 
    end 

    def foo_enabled? 
     puts 'sleep for 100s !' 
     true 
    end 
end 

class EmployeeController < ApplicationController 
    skip_before_action :foo, only: [:bar] 

    def bar 
     puts 'inside bar' 
    end 
end 

回答

1

foo_enabled?是,如果foo應在所有所謂的條件。 然後確定foo應該被調用,但EmployeeController跳過它而不是bar

如果foo_enabled?返回false那麼將沒有foo行動執行,因此沒有什麼可以「跳過」。

由於before_action基於if有條件,因此必須先評估if以確定操作是否應觸發。

確定後,skip_before_action評估是否應該跳過。簡化工作流程說明:

#ApplicationController 
if foo_enabled? 
    #EmployeeController 
    if skip_action == :foo && !skip_action[:only].includes?(current_action) 
    foo 
    end 
end 
1

我想原因是,一旦你開始使用你的回調條件,則回調總是檢查,看他們是否應該運行。

你會認爲,相當合理地,skip_會從該行爲的回調中完全刪除該回調。相反,我認爲,它增加了一個條件。 only:條件增加了一個類似unless: Proc.new { action_name == 'bar' }的檢查。

根據條件得到檢查的順序,很可能您的foo_enabled?條件在only:條件之前被檢查,這就是爲什麼你看到你的方法被調用的原因。代碼遍歷回調以檢查它們是否應該運行,並且在EmployeeController中添加之前檢查ApplicationController的條件。

相關代碼位於activesupport gemlib/active_support/callbacks.rbactionpack gemlib/abstract_controller/callbacks.rb中。這對我來說有點困難,但我認爲我所描述的是它的本質。

相關問題