腳手架代後,我們通常會得到這樣的一行:``只有:```before_action`如何在Rails中工作?
before_action :set_newsletter_email, only: [:show, :edit, :update, :destroy]
有人能解釋我這only:
符號究竟是如何工作的,以及它如何影響安全?
腳手架代後,我們通常會得到這樣的一行:``只有:```before_action`如何在Rails中工作?
before_action :set_newsletter_email, only: [:show, :edit, :update, :destroy]
有人能解釋我這only:
符號究竟是如何工作的,以及它如何影響安全?
before_action
的only
選項定義了一個動作或者當方法/塊首先被執行時的動作列表。
例:
# defined actions: [:show, :edit, :update, :destroy]
before_action :set_newsletter_email, only: [:show, :edit]
的set_newsletter_email
方法只是show
和edit
行動之前被調用。
與之相反的選項except
定義何時不執行方法/塊。
# defined actions: [:show, :edit, :update, :destroy]
before_action :set_newsletter_email, except: [:show, :edit]
的set_newsletter_email
方法被調用EXCEPT show
和edit
現有的所有行動。
only
/except
只是一種白名單/黑名單。
選項:only
在本示例中運行方法':set_newsletter_email',當在當前控制器中調用在方括號[:show, :edit, :update, :destroy]
的列表中定義的任何動作並在動作運行之前運行該方法。控制器中定義的任何其他操作都不會執行:set_newsletter_email
方法。
你也可以做相反的事情與:except
選項定義將在控制器以外,與列在自己的每一個動作的run方法。
你也可以做after_action
將在控制器的動作後運行
你可以閱讀有關的過濾器和這裏所有的選項: http://guides.rubyonrails.org/action_controller_overview.html#filters
當用戶只瀏覽到這些路由,它將觸發:set_newsletter_email
功能,通常在該控制器文件的末尾。
所以當用戶導航到索引方法時,它不會觸發它,因爲:set_newsletter_email
是只有調用方括號上的方法。
在這種情況下回調需要,因爲它設置資源的單個資源的觀點它呈現之前。
例如:
/newsletter/2
路線將觸發:set_newsletter_email
,將首先從鏈接參數的ID,然後它會尋找資源,並設置一個實例變量與它。
我不知道在這種情況下你對安全性有什麼擔心,但是這個回調函數只能獲取id參數來設置資源,而且因爲你使用腳手架,它也會生成一個params函數(也在該文件)將生成腳手架時先前定義的參數列入白名單。
你可以在這裏找到更多的信息:http://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html
如果你要我解釋更多或澄清一些只問
謝謝您的回答!你的例子首先對於我來說並不完全清楚,因爲評論中可用操作的列表 - 你的意思是可用操作只是控制器中定義的所有操作,不是嗎? –
@KarolSelak是的,確切地說 – MrYoshiji