2016-03-18 30 views
1

我在我的rails應用程序中使用cancancan gem。但我不太清楚load_and_authorize_resource方法的含義。我知道這跟調用load_resourceauthorize_resource是一樣的。如何理解cancancan gem的load_resource和authorize_resource方法?

load_resource將創建模型的新實例,或者通過params[:id]得到一個實例或實例集合,然後authorize_resource方法將使用這些實例來授權。但是如果我在每個控制器動作中已經有Model.find(params[:id])Model.new,我需要添加load_resource方法嗎?

對於某些操作(非RESTful操作),它們與模型沒有關係,所以我不需要獲取實例,對於這種情況,authorize_resource如何正常工作?

任何想法是感激!提前致謝!

回答

1

load_and_authorize_resource集對於每個動作加載資源到一個實例變量和自動授權它before_filter。所以這對於RESTful操作很有用。現在,如果你在同一個控制器非RESTful的行動不能加載你能做的資源:

load_and_authorize_resource only: [:index, :show] 

OR

skip_load_resource only: :new 

這將跳過before_filter對這些行爲。

而且,如果您控制人Model.find(params[:id])要麼你可以刪除或只使用:

authorize_resource 

你不會需要load_resource這些動作。 load_resource也做你手動完成的相同的事情。它只是增加了一個before_action到所有動作,並根據id找到對象。

而且load_resource將始終爲您提供實例變量,其名稱爲Model,因此如果您在視圖中使用不同的東西來代表對象,那麼它也無濟於事。所以選擇一個選項將取決於你和你的代碼。

Cancancan百科:

由於慘慘1.5,你可以使用skip_load_and_authorize_resourceskip_load_resourceskip_authorize_resource方法跳過任何應用的行爲和篩選之前,在指定喜歡的具體行動。

希望這會有所幫助。

+0

如果我跳過'new'行動authorize_resource,任何人都可以訪問此API,這不是我想要的,怎麼解決這個問題呢? – pangpang

+0

對不起,應該是'skip_load_resource'。我已經更新了答案 – Deep