为什么on Rails的行动“破坏”了Ruby未命名“删除”?(Why the Ruby on Ra

2019-08-16 18:50发布

该CRUD原则定义持久性数据的四种基本操作:

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

HTTP动词也使用DELETE字。

为什么在Rails的默认路由用的是“ 消灭 ”了对应的HTTP动词DELETE操作?

Answer 1:

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

  • 得到
  • POST
  • 删除

除了它有7个REST风格的动作:

  • 指数
  • 创建
  • 编辑
  • 更新
  • 节目
  • 破坏

轨道从来没有使用相同的动词为相应的动作。 路由的行动销毁能够做的多单DELETE,更多的是通过在控制器中相应的动作。

这railsguide可能是你的兴趣: http://guides.rubyonrails.org/routing.html

说明

浏览器通过使用特定的HTTP方法,如GET,POST,PUT和DELETE制造用于URL的请求请求的Rails页面。 每一种方法是对资源执行的操作的请求。 资源路线图的一些在单个控制器相关的请求的行动。

现在,假设我们有一个HTTP GET请求,这意味着你要读/检索数据。 如果动作将具有相同的名称作为动词,GET在这种情况下,这将是过于简单化。 GET可以给访问表明,指数,新的或编辑的操作。 他们都读取数据,但行为本身是绝对不一样的。 同样可以对删除请求说。 此请求是通过所述控制器处理并且可以具有内的动作不同的实现。 这可能是你想要摧毁一个职位,但它也可能意味着你要注销用户会话。 只有那些具有所谓的删除就不能证明有关它的可能性的动作,通过控制器。

编辑

如果您想了解更多关于浏览器的请求是如何被处理,你可以阅读有关M(奥德尔)V的一些信息(IEW)C(ontroller)-model Rails会使用:

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服务器(杂种,使用WEBrick等)接收该请求。 它采用的路线,以找出哪些控制器使用方法:将默认路由模式是在配置/ routes.rb中定义的“/控制器/操作/ ID”。

这意味着您的初始请求将被翻译,并通过Web服务器处理和正确的路线必须通过控制器,其中宁静的动作,如破坏,位于限定。

在Rails的初期,当时只有2动词的,即GET和POST(因为PUT和DELETE不支持,以后版本的Rails加入PUT,并通过隐变量DELETE解决。销毁行动的名称没有改变,因为要求和行动是两码事。

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



Answer 2:

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

删除方法基本上从数据库中删除的行(或行阵列)。 破坏,另一方面允许更多的选项。 首先,它会检查任何回调,如before_delete,或者说我们在模型中指定的依赖。 接下来,它会保持这种刚刚在内存中删除的对象; 这让我们留下一个消息,说像“订单#{} order.id已被删除。”最后,也是最重要的是,它还会删除与该对象关联的所有子对象!

知道了,它才有意义来调用控制器一样的人在模型中的作用。 删除是过于简单化



Answer 3:

好问题。

我觉得这是鼓励你总是使用destroy ,而不是delete你的对象。

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



Answer 4:

下面是从瑞安贝茨的很早(2007)答案

基本上,“删除”直接发送查询到数据库中删除的记录。 在这种情况下,Rails不知道是什么属性是它也不会delete一个记录,如果有任何回调(如before_destroy)。

在“消灭”方法需要传入ID,使用“查找”方法从数据库中获取的模型,然后调用破坏上。 这意味着回调被触发。

您可能需要使用“删除”,如果你不想被触发的回调或者你想更好的性能做。 否则(大部分时间),你会想用“消灭”。

资源



文章来源: Why the Ruby on Rails action “destroy” is not named “delete”?