CRUD 原则定义了对持久数据的四种基本操作:
- 创造,
- 读,
- 更新,
- 删除。
HTTP 动词也使用 DELETE 词。
为什么Rails 中的默认路由使用单词“ destroy ”来表示对应于 HTTP 动词DELETE的操作?
CRUD 原则定义了对持久数据的四种基本操作:
HTTP 动词也使用 DELETE 词。
为什么Rails 中的默认路由使用单词“ destroy ”来表示对应于 HTTP 动词DELETE的操作?
Rails 使用 4 种标准方法(动词),即:
此外,它还有 7 个 RESTful 操作:
Rails 从不使用与相应动作相同的动词。路由到动作destroy可以通过控制器中的相应动作执行多个DELETE。
您可能会对这个 railsguide 感兴趣:http: //guides.rubyonrails.org/routing.html
解释
浏览器通过使用特定的 HTTP 方法(例如 GET、POST、PUT 和 DELETE)请求 URL 来从 Rails 请求页面。每个方法都是对资源执行操作的请求。资源路由将多个相关请求映射到单个控制器中的操作。
现在,假设我们有一个 HTTP GET 请求,这意味着您想要读取/检索数据。如果动作与动词同名,在这种情况下为 GET,则过于简单化。GET 可以授予对显示、索引、新建或编辑操作的访问权限。他们都读取数据,但动作本身肯定不一样。DELETE 请求也是如此。此请求通过控制器处理,并且可以在操作中具有不同的实现。可能是您想销毁帖子,但这也可能意味着您想退出用户会话。只有一个名为 delete 的动作并不能证明与它相关的可能性,通过控制器。
编辑
如果您想了解更多有关如何处理来自浏览器的请求的信息,您可以阅读有关 Rails 使用的 M(odel)V(iew)C(ontroller) 模型的一些信息:
http://www.youtube.com/watch?v=3mQjtk2YDkM&noredirect=1
和:
http://betterexplained.com/articles/intermediate-rails-understanding-models-views-and-controllers/
来自此链接的报价:
浏览器发出请求,例如http://mysite.com/video/show/15 Web 服务器(mongrel、WEBrick 等)接收请求。它使用路由来找出要使用的控制器:默认路由模式是 config/routes.rb 中定义的“/controller/action/id”。
这意味着您的初始请求将通过网络服务器进行翻译和处理,并且必须通过控制器定义正确的路由,其中休息操作(例如销毁)所在的位置。
Rails 早期只有 2 个动词,即 GET 和 POST(由于不支持 PUT 和 DELETE,后来版本的 rails 通过隐藏变量添加 PUT 和 DELETE 解决了这个问题。destroy 动作的名称从未改变,因为请求和操作是两个不同的东西。
Actions || show || create || update || destroy
SQL || select|| create || update || delete
REST || get || post || post || post
Actions || show || create || update || destroy
SQL || select|| create || update || delete
REST || get || post || put || delete
这句话可能更有趣:
“因为路由器使用 HTTP 动词和 URL 来匹配入站请求,所以四个 URL 映射到七个不同的操作。”
对于模型部分,这是来自http://www.nickpeters.net/2007/12/21/delete-vs-destroy/的一个很好的总结:
delete 方法实质上是从数据库中删除一行(或一组行)。另一方面,Destroy 提供了更多选择。首先,它将检查任何回调,例如 before_delete,或我们在模型中指定的任何依赖项。接下来,它将把刚刚被删除的对象保留在内存中;这让我们可以留言说“订单#{order.id} 已被删除”。最后,也是最重要的,它还将删除与该对象关联的所有子对象!
知道了这一点,只有将控制器中的动作与模型中的动作调用相同才有意义。删除太简单了。
好问题。
我觉得这是为了鼓励您始终使用destroy
而不是delete
在您的对象上。
实际上,delete
不会触发任何回调。
这是 Ryan Bates 非常早(2007 年)的回答
基本上“删除”直接向数据库发送查询以删除记录。在这种情况下,Rails 不知道它正在删除的记录中有哪些属性,也不知道是否有任何回调(例如 before_destroy)。
“destroy”方法获取传递的 id,使用“find”方法从数据库中获取模型,然后对其调用 destroy。这意味着回调被触发。
如果您不希望触发回调或想要更好的性能,您可能需要使用“删除”。否则(大多数时候)你会想要使用“destroy”。