所以我一直在看人们使用.build,.create和.create!最近他们的控制者越来越多。只使用.new和passig param'd对象然后.save有什么区别?有利有弊吗?使用这些其他方法会带来好处吗?
答案 0 :(得分:224)
有一些差异,但它们并不大:
.create
相当于.new
,后跟.save
。它更简洁。.create!
相当于.new
后跟.save!
(如果保存失败则会抛出错误)。它也只是一点点.build
主要是 .new
的别名。它是works one way in Rails 3和Rails中的另一种方式< 3.X 然而,最重要的部分是可以通过关联(has_many
等)调用这些方法来自动链接这两个模型。
答案 1 :(得分:32)
尽管create
调用new
然后调用save
是正确的,但两个替代品的返回值之间存在很大差异。
Save
返回true
或false
,具体取决于对象是否已成功保存到数据库。根据上述问题中的第一个例子,这可以用于流量控制。
Create
都将返回模型。这对上面的代码有影响,因为即使对象验证失败并且未保存,if
语句的顶部分支也将始终执行。
如果您使用create
分支逻辑,那么您将面临无声失败的风险,如果您使用new
+ save
则不会出现这种情况。
create!
不会遇到与引发相同的问题和异常。
create
替代方案在respond_with
用于API(JSON / XML)响应的控制器中非常有用。在这种情况下,对象上存在错误将导致错误在状态为unprocessable_entity
的响应中返回,这正是您想要的API。
我总是会对html使用new
+ save
选项,特别是如果您依赖流控制的返回值。
答案 2 :(得分:6)
#create是new的新版本并保存。 #创建!如果验证不是肯定的,则抛出异常。
答案 3 :(得分:5)
我是第二个上面的答案。加上create
,我们无法将false
作为save
的参数传递。将false
作为参数传递将跳过所有rails验证