为什么Ruby on Rails操作“destroy”没有命名为“delete”?

时间:2013-02-06 13:37:41

标签: ruby-on-rails http rest crud

CRUD principle定义了持久数据的四个基本操作:

  • 创建,
  • 读取,
  • 更新
  • 删除。

HTTP谓词也使用DELETE字。

为什么default routing in Rails使用“销毁”一词来表示与HTTP动词 DELETE 对应的操作?

4 个答案:

答案 0 :(得分:24)

Rails使用4种标准方法(动词),即:

  • GET
  • POST
  • PUT
  • DELETE

此外它有7个RESTful动作:

  • 索引
  • 创建
  • 修改
  • 更新
  • 显示
  • 破坏

Rails从不使用与相应动作相同的动词。路由到动作destroy可以通过控制器中的相应操作执行多个DELETE。

您可能会对此导轨感兴趣: http://guides.rubyonrails.org/routing.html

<强>解释

  

浏览器通过使用特定HTTP方法(例如GET,POST,PUT和DELETE)请求URL来从Rails请求页面。每种方法都是对资源执行操作的请求。资源路由将许多相关请求映射到单个控制器中的操作。

现在,假设我们有一个HTTP GET请求,这意味着您想要读取/检索数据。如果动作与动词具有相同的名称,在这种情况下为GET,则过于简单化。 GET可以访问show,index,new或edit操作。他们都读取数据,但行动本身肯定不一样。关于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”。

意味着您的初始请求将通过Web服务器进行翻译和处理,并且必须通过控制器定义正确的路由,其中​​包含诸如destroy之类的restful操作。

在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://guides.rubyonrails.org/routing.html

答案 1 :(得分:6)

对于模型部分,这里是http://www.nickpeters.net/2007/12/21/delete-vs-destroy/的一个很好的总结:

  

delete方法基本上删除了一行(或行数组)   数据库。另一方面,Destroy允许更多选项。   首先,它将检查任何回调,例如before_delete或any   我们在模型中指定的依赖项。接下来,它会保持   刚刚在内存中删除的对象;这让我们离开了   消息说“Order#{order.id}已被删除。”   最后,最重要的是,它还将删除任何子对象   与该对象相关联!

知道这一点,只有在控制器中调用动作与模型中的动作相同才有意义。 删除过于简单

答案 2 :(得分:2)

好问题。

我觉得鼓励你总是在对象上使用destroy而不是delete

实际上,delete不会触发任何回调。

答案 3 :(得分:2)

这是Ryan Bates的一个非常早期的(2007年)答案

  

基本上“删除”会直接向数据库发送查询以删除记录。在这种情况下,Rails不知道它正在删除的记录中有哪些属性,也没有任何回调(例如before_destroy)。

     

“destroy”方法接受传递的id,使用“find”方法从数据库中获取模型,然后调用destroy。这意味着会触发回调。

     

如果您不希望触发回调或希望获得更好的性能,则需要使用“删除”。否则(大多数时候)你会想要使用“destroy”。

source