.build,.create和.create之间的区别!什么时候应该使用?

时间:2008-12-31 18:14:50

标签: ruby-on-rails

所以我一直在看人们使用.build,.create和.create!最近他们的控制者越来越多。只使用.new和passig param'd对象然后.save有什么区别?有利有弊吗?使用这些其他方法会带来好处吗?

4 个答案:

答案 0 :(得分:224)

有一些差异,但它们并不大:

  1. .create相当于.new,后跟.save。它更简洁。
  2. .create!相当于.new后跟.save!(如果保存失败则会抛出错误)。它也只是一点点
  3. 我认为.build 主要是 .new的别名。它是works one way in Rails 3和Rails中的另一种方式< 3.X
  4. 然而,最重要的部分是可以通过关联(has_many等)调用这些方法来自动链接这两个模型。

答案 1 :(得分:32)

尽管create调用new然后调用save是正确的,但两个替代品的返回值之间存在很大差异。

Save返回truefalse,具体取决于对象是否已成功保存到数据库。根据上述问题中的第一个例子,这可以用于流量控制。

无论对象是否已保存,

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验证