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