2017-08-10 45 views

回答

4

before_actiononly選項定義了一個動作或者當方法/塊首先被執行時的動作列表。

例:

# defined actions: [:show, :edit, :update, :destroy] 
before_action :set_newsletter_email, only: [:show, :edit] 

set_newsletter_email方法只是showedit行動之前被調用。


與之相反的選項except定義何時不執行方法/塊。

# defined actions: [:show, :edit, :update, :destroy] 
before_action :set_newsletter_email, except: [:show, :edit] 

set_newsletter_email方法被調用EXCEPT showedit現有的所有行動。


only/except只是一種白名單/黑名單。

+0

謝謝您的回答!你的例子首先對於我來說並不完全清楚,因爲評論中可用操作的列表 - 你的意思是可用操作只是控制器中定義的所有操作,不是嗎? –

+1

@KarolSelak是的,確切地說 – MrYoshiji

1

選項:only在本示例中運行方法':set_newsletter_email',當在當前控制器中調用在方括號[:show, :edit, :update, :destroy]的列表中定義的任何動作並在動作運行之前運行該方法。控制器中定義的任何其他操作都不會執行:set_newsletter_email方法。

你也可以做相反的事情與:except選項定義將在控制器以外,與列在自己的每一個動作的run方法。

你也可以做after_action將在控制器的動作後運行

你可以閱讀有關的過濾器和這裏所有的選項: http://guides.rubyonrails.org/action_controller_overview.html#filters

1

當用戶只瀏覽到這些路由,它將觸發:set_newsletter_email功能,通常在該控制器文件的末尾。

所以當用戶導航到索引方法時,它不會觸發它,因爲:set_newsletter_email只有調用方括號上的方法。

在這種情況下回調需要,因爲它設置資源的單個資源的觀點它呈現之前。

例如:

/newsletter/2路線將觸發:set_newsletter_email,將首先從鏈接參數的ID,然後它會尋找資源,並設置一個實例變量與它。

我不知道在這種情況下你對安全性有什麼擔心,但是這個回調函數只能獲取id參數來設置資源,而且因爲你使用腳手架,它也會生成一個params函數(也在該文件)將生成腳手架時先前定義的參數列入白名單。

你可以在這裏找到更多的信息:http://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html

如果你要我解釋更多或澄清一些只問