2010-03-18 44 views
163

为什么需要在RESTful控制器中定义一个新方法,并使用create方法进行跟踪?Rails new vs create

谷歌搜索没有为我提供我正在寻找的答案。我了解其中的差异,但需要知道为什么他们以他们的方式使用。

回答

216

在Rails的REST实施中新的创建的处理方式不同。

一个HTTP GET到/resources/new旨在提供适于创建一个新的资源,它通过调用控制器,它创建了一个新的未保存记录和呈现形式中行动的形式。

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

+1

感谢您的解释,我对这两者感到困惑。 – Batman 2015-07-06 04:46:57

+1

更多类似这样的回答;)谢谢! – servatj 2015-11-03 22:28:09

+0

我在rails教程网站上精确地浏览了这些信息。直到我真正使用它,它才变得相关。 – StorymasterQ 2016-01-20 01:02:14

13

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

创建与新建一样,但也将其保存到数据库。

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

+1

这个问题是关于控制器方法,而不是模型方法。 – sevenseacat 2012-07-25 01:51:38

219

ActiveRecord::Base文档:

创建(属性=无){|对象| ...}

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

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

新对象可以被实例化或者为空(没有传递施工参数)或预先设定属性,但还没有被保存(通过匹配相关的表的列名的键名的哈希)。在这两种情况下,有效的属性键都由关联表的列名确定 - 因此,您不能拥有不属于表列的属性。

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

+20

当我找到这个页面时,我一直在寻找你提供的答案。谢谢! – ClosureCowboy 2011-01-26 14:46:51

+0

没问题,很高兴帮助:) – 2011-01-26 15:17:18

+4

这个问题是关于控制器方法,而不是模型方法。 – sevenseacat 2012-07-25 01:51:58

9

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

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

相关问题