Rails新建与创建


195

为什么需要在RESTful控制器中定义一个新方法,然后再创建一个方法呢?

Google搜索未提供我所需要的答案。我了解其中的区别,但是需要知道为什么要按原样使用它们。

Answers:


263

在Rails的REST实现中,对newcreate的处理方式有所不同。

HTTP GET to /resources/new旨在呈现适合创建新资源的表单,它通过在控制器内调用new动作来做到这一点,控制器会创建一个新的未保存的记录并呈现该表单。

HTTP POST /resources接收作为操作的一部分创建的记录,并将其传递到控制器内的create动作,然后尝试将其保存到数据库中。


1
我在Rails教程站点中准确浏览了这些信息。直到我真正使用它,它才有意义。
StorymasterQ

248

ActiveRecord :: Base文档中:

create(attributes = nil){| object | ...}

如果验证通过,则创建一个(或多个)对象并将其保存到数据库。无论对象是否成功保存到数据库,都将返回结果对象。

new(attributes = nil){|如果block_given给定,则为自身?| ...}

可以将新对象实例化为空(不传递任何构造参数),也可以将其实例化为具有属性的预置,但尚未保存(传递键名称与关联的表列名称匹配的哈希值)。在这两种情况下,有效的属性键均由关联表的列名确定-因此,您不能拥有不属于表列的属性。

因此,create实例化新对象,对其进行验证,然后将其保存到数据库中。并且new仅创建本地对象,而不尝试验证或将其保存到数据库。


5
这个问题是关于控制器方法,而不是模型方法。
sevenseacat 2012年

8
@Karpie-感谢您的反对。您提出了一个很好的观点,但是认为许多人认为此答案很有用,尤其是因为标题或标签都没有将其称为仅控制器问题。所以我认为这个答案提供的价值是相同的。
贾斯汀·埃斯蒂尔

16

New实例化一个新的Model实例,但是直到调用save方法时它才被保存。

Create与new一样,但也将其保存到数据库中。

有时您想要在将某些内容保存到数据库之前先做一些事情,有时您只是想立即创建并保存它。


1
这个问题是关于控制器方法,而不是模型方法。
sevenseacat 2012年

11

Rails的RESTful部分非常接近HTTP协议的工作方式。在HTTP协议中,不应要求GET请求修改任何数据。从逻辑上讲,如果您查看Rails中所有RESTful动作的工作方式,它们将与HTTP动作匹配。POST用于生成新数据,因此在逻辑上是创建的。您可以使用GET来提供该表单的版本,也就是新动作。索引和显示也是GET,更新是PUT(在Rails 4+中是PATCH),而销毁是HTTP中的DELETE。

此外,它很好地分离了控制器中的逻辑,并为您提供了一种处理错误的流畅方法(通过使用错误消息重新呈现新操作)。


"You use a GET to serve the form version of that or in other words, the new action"感谢您的回答,但就我个人而言,这种命名约定确实令人困惑
Daniel Lizik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.