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