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
發現,但爲什麼是更好?我一直無法找到任何過於深入的答案。
這取決於用例。過度嵌套的路線可以被看作是一種代碼味道,安全動機似乎充其量是可疑的。這聽起來像是授權層應該處理的事情。非嵌套路由和控制器不那麼複雜,並且避免需要傳遞第二個參數。 – max
絕對不是方法2.除非您仔細檢查用戶是否有權訪問該評論的銷燬行爲,否則他可以簡單地修改HTML,替換評論的ID並銷燬其他人的評論。通常,第三種方法是最好的,加上一個before_action,它爲那個CommentsController的所有動作設置'@ article'變量 – MrYoshiji