所以最近我看到越来越多的人在他们的控制器中使用 .build、 .create和 .create!。仅仅使用 .new并传递 param’d 对象和 .save有什么区别?有利有弊吗?使用这些其他方法有好处吗?
.build
.create
.create!
.new
.save
# create 是 new 和 save 的缩写。 如果验证不正确,# create! 将抛出异常。
虽然有一些不同,但并不是很大:
.save!
然而,最重要的部分是,可以通过关联(has_many等)调用这些方法来自动链接两个模型。
has_many
我赞成上述答案。另外,对于 create,不能将 false作为参数传递,这可以用 save来实现。将 false作为参数传递将跳过所有 Rails 验证
create
false
save
虽然 create调用 new,然后调用 save是正确的,但是这两个选项在返回值上有很大的差异。
new
根据对象是否成功保存到数据库,Save返回 true或 false。然后可以按照上面问题中的第一个示例将其用于流控制。
Save
true
无论对象是否保存,Create都将返回模型。这对上面的代码有影响,因为即使对象验证失败且没有保存,也始终会执行 if语句的顶部分支。
Create
if
如果使用带有分支逻辑的 create,则存在无声故障的风险,而使用 new + save则不会出现这种情况。
如果记录无效,create!不会出现引发的相同问题和异常。
create!
在使用 respond_with作为 API (JSON/XML)响应的控制器中,create备选方案非常有用。在这种情况下,对象上错误的存在将导致在响应中返回具有 unprocessable_entity状态的错误,这正是您希望从 API 得到的。
respond_with
unprocessable_entity
对于 html,我总是使用 new + save选项,特别是当您依赖返回值进行流控制时。