为什么需要在RESTful控制器中定义一个新方法,然后再创建一个方法?
谷歌搜索并没有给我提供我想要的答案。我理解其中的区别,但需要知道为什么它们是这样使用的。
为什么需要在RESTful控制器中定义一个新方法,然后再创建一个方法?
谷歌搜索并没有给我提供我想要的答案。我理解其中的区别,但需要知道为什么它们是这样使用的。
当前回答
New实例化了一个新的Model实例,但是直到save方法被调用,它才被保存。
Create的作用与new相同,但也将其保存到数据库中。
有时您希望在将内容保存到数据库之前做一些事情,有时您只想立即创建并保存它。
其他回答
在Rails的REST实现中,new和create被区别对待。
到/resources/new的HTTP GET旨在呈现一个适合创建新资源的表单,它通过调用控制器中的new操作来完成,该操作将创建一个新的未保存记录并呈现表单。
到/resources的HTTP POST接受作为新操作一部分创建的记录,并将其传递给控制器中的create操作,然后该操作尝试将其保存到数据库。
关于Rails模型,ActiveRecord::Base文档声明:
创建(属性= nil){|对象|…}
如果验证通过,创建一个对象(或多个对象)并将其保存到数据库。无论对象是否成功保存到数据库,都会返回结果对象。
新建(属性= nil) {|self如果block_given?|…}
新对象可以实例化为空对象(不传递构造参数),也可以实例化为预先设置了属性但尚未保存的对象(传递键名与相关表列名匹配的散列)。在这两个实例中,有效的属性键都是由相关表的列名决定的——因此您不能拥有不属于表列的属性。
因此create实例化新对象,验证它,然后将它保存到数据库中。new只创建本地对象,但不尝试验证或将其保存到DB。
The RESTful parts of Rails are made to be very close to how the HTTP protocol works. In the HTTP protocol, a GET request isn't supposed to modify any data. Logically, if you look at the way all of the RESTful actions in Rails work, they will match up with HTTP actions. A POST is for generating new data, so it is logically create. You use a GET to serve the form version of that or in other words, the new action. Index and show are also GETs, update is a PUT (or PATCH in Rails 4+), and destroy is a DELETE in HTTP.
此外,它很好地分离了控制器中的逻辑,并为您提供了一种平滑的方法来处理错误(通过使用错误消息重新呈现新动作)。
New实例化了一个新的Model实例,但是直到save方法被调用,它才被保存。
Create的作用与new相同,但也将其保存到数据库中。
有时您希望在将内容保存到数据库之前做一些事情,有时您只想立即创建并保存它。