CRUD principle定义了持久数据的四个基本操作:
HTTP谓词也使用DELETE字。
为什么default routing in Rails使用“销毁”一词来表示与HTTP动词 DELETE 对应的操作?
答案 0 :(得分:24)
Rails使用4种标准方法(动词),即:
此外它有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映射到七个不同的操作。”
答案 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”。