2017-08-17 37 views
1

想象一下,我們有一個Article和一個Comment模型。我們建立我們的路線,如:現在通過父母或自己更新關聯記錄會更好嗎?

# routes.rb 
resources :articles do 
    resources :comments 
end 

,我們可以摧毀通過CommentController一個comment,但也有一些是我見過已經實現的方法。

# method 1 
def destroy 
    Comment.where(article_id: params[:article_id]).find(params[:id]).destroy 
end 

# method 2 
def destroy 
    Comment.find(params[:id]).destroy 
end 

# method 3 
def destroy 
    article = Article.find(params[:article_id]) 
    comment = article.comments.find(params[:id]) 
    comment.destroy 
end 

哪個更好?爲什麼?

我見過老Railscasts情節和博客,我們應該做前者爲「安全」的原因或者是因爲它是更好地保證comments只能在各自article發現,但爲什麼是更好?我一直無法找到任何過於深入的答案。

+0

這取決於用例。過度嵌套的路線可以被看作是一種代碼味道,安全動機似乎充其量是可疑的。這聽起來像是授權層應該處理的事情。非嵌套路由和控制器不那麼複雜,並且避免需要傳遞第二個參數。 – max

+0

絕對不是方法2.除非您仔細檢查用戶是否有權訪問該評論的銷燬行爲,否則他可以簡單地修改HTML,替換評論的ID並銷燬其他人的評論。通常,第三種方法是最好的,加上一個before_action,它爲那個CommentsController的所有動作設置'@ article'變量 – MrYoshiji

回答

1

當您以這種方式處理嵌套數據時,最好將模型查找的範圍限定在父級範圍內,以避免人們以簡單的方式迭代id。你通常想阻止這一點,如果它是一種習慣,它會保護你免受更嚴重的安全問題。

例如,假設您對Article有某種可見性權限。使用方法2,可以使用article_id,您可以查看它以訪問您不是的評論。

方法1 & 3表面上看起來是做同樣的事情,但我更喜歡1,因爲它使用更少的數據庫訪問。