【发布时间】:2017-08-17 19:07:17
【问题描述】:
假设我们有一个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 中找到,我们应该这样做,但是为什么那个更好吗?我一直无法找到任何深入到答案的内容。
【问题讨论】:
-
这取决于用例。过度嵌套的路由可以被视为代码异味,而安全动机充其量似乎是可疑的。听起来好像应该处理的是授权层。非嵌套路由和控制器不太复杂,并且无需传递第二个参数。
-
绝对不是方法 2。除非您仔细检查用户是否可以访问该评论的销毁操作,否则他可以简单地修改 HTML,替换评论的 id 并从其他人。通常,第三种方法是最好的,结合 before_action 为该 CommentsController 的所有操作设置
@article变量
标签: ruby-on-rails activerecord associations