为什么需要在RESTful控制器中定义一个新方法,用create方法跟进呢?
谷歌搜索没有提供我正在寻找的答案 . 我理解其中的差异,但需要知道它们的使用方式 .
Rails的RESTful部分非常接近HTTP协议的工作方式 . 在HTTP协议中,GET请求不应该修改任何数据 . 从逻辑上讲,如果您查看Rails中所有RESTful操作的工作方式,它们将与HTTP操作相匹配 . POST用于生成新数据,因此它在逻辑上是创建的 . 您使用GET来提供表单版本或换句话说,即新操作 . 索引和显示也是GET,更新是PUT(或Rails 4中的PATCH),而destroy是HTTP中的DELETE .
此外,它很好地分离了控制器中的逻辑,并为您提供了一种处理错误的平滑方法(通过使用错误消息重新呈现新操作) .
在Rails的REST实现中,new和create的处理方式不同 .
HTTP GET到 /resources/new 旨在呈现适合于创建新资源的表单,它通过调用控制器中的新操作来执行,该操作创建新的未保存记录并呈现表单 .
/resources/new
到 /resources 的HTTP POST将创建的记录作为新操作的一部分,并将其传递给控制器中的create操作,然后控制器尝试将其保存到数据库中 .
/resources
New实例化一个新的Model实例,但在调用save方法之前不会保存它 .
Create与new相同,但也将其保存到数据库中 .
有时您希望在将某些内容保存到数据库之前执行操作,有时您只是想立即创建并保存它 .
从ActiveRecord::Base文档:
create(attributes = nil) {|object| ...}
如果验证通过,则创建一个对象(或多个对象)并将其保存到数据库 . 无论对象是否已成功保存到数据库,都会返回结果对象 .
new(attributes = nil) {|self if block_given?| ...}
可以将新对象实例化为空(传递无构造参数)或使用属性预先设置但尚未保存(传递具有与关联表列名匹配的键名称的哈希) . 在这两种情况下,有效的属性键由关联表的列名确定 - 因此您不能拥有不属于表列的属性 .
所以 create 实例化新对象,验证它,然后将其保存到数据库 . 并且 new 仅创建本地对象,但不会尝试验证或将其保存到数据库 .
create
new
4 回答
Rails的RESTful部分非常接近HTTP协议的工作方式 . 在HTTP协议中,GET请求不应该修改任何数据 . 从逻辑上讲,如果您查看Rails中所有RESTful操作的工作方式,它们将与HTTP操作相匹配 . POST用于生成新数据,因此它在逻辑上是创建的 . 您使用GET来提供表单版本或换句话说,即新操作 . 索引和显示也是GET,更新是PUT(或Rails 4中的PATCH),而destroy是HTTP中的DELETE .
此外,它很好地分离了控制器中的逻辑,并为您提供了一种处理错误的平滑方法(通过使用错误消息重新呈现新操作) .
在Rails的REST实现中,new和create的处理方式不同 .
HTTP GET到
/resources/new
旨在呈现适合于创建新资源的表单,它通过调用控制器中的新操作来执行,该操作创建新的未保存记录并呈现表单 .到
/resources
的HTTP POST将创建的记录作为新操作的一部分,并将其传递给控制器中的create操作,然后控制器尝试将其保存到数据库中 .New实例化一个新的Model实例,但在调用save方法之前不会保存它 .
Create与new相同,但也将其保存到数据库中 .
有时您希望在将某些内容保存到数据库之前执行操作,有时您只是想立即创建并保存它 .
从ActiveRecord::Base文档:
create(attributes = nil) {|object| ...}
new(attributes = nil) {|self if block_given?| ...}
所以
create
实例化新对象,验证它,然后将其保存到数据库 . 并且new
仅创建本地对象,但不会尝试验证或将其保存到数据库 .