Rails new vs create

时间:2010-03-18 18:29:01

标签: ruby-on-rails rest

为什么需要在RESTful控制器中定义一个新方法,然后使用create方法进行跟进?

Google搜索没有向我提供我正在寻找的答案。我理解其中的差异,但需要知道为什么它们会按原样使用。

4 个答案:

答案 0 :(得分:249)

在Rails的REST实现中, new create 的处理方式不同。

/resources/new的HTTP GET旨在呈现适合创建新资源的表单,通过调用控制器中的 new 操作来创建新的未保存记录并呈现表格。

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

答案 1 :(得分:240)

来自ActiveRecord::Base文档:

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

  

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

new(attributes = nil){| self if block_given?| ...}

  

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

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

答案 2 :(得分:14)

New实例化一个新的Model实例,但在调用save方法之前不会保存它。

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

有时你想在将某些东西保存到数据库之前做一些事情,有时你只想创建并立即保存它。

答案 3 :(得分:9)

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

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