【发布时间】:2010-09-29 01:18:50
【问题描述】:
所以我最近越来越多地看到人们在他们的控制器中使用.build、.create 和.create!。与仅使用 .new 并传递参数对象然后 .save 有什么区别?有优点和缺点吗?使用这些其他方法是否有好处?
【问题讨论】:
标签: ruby-on-rails
所以我最近越来越多地看到人们在他们的控制器中使用.build、.create 和.create!。与仅使用 .new 并传递参数对象然后 .save 有什么区别?有优点和缺点吗?使用这些其他方法是否有好处?
【问题讨论】:
标签: ruby-on-rails
有一些差异,但并不大:
.create 等价于 .new 后跟 .save。它更简洁。.create! 等价于 .new 后跟 .save! (如果保存失败则抛出错误)。它也只是稍微短了一点.build大部分是.new 的别名。它works one way in Rails 3 和 Rails 中的另一种方式
然而,最重要的部分是这些方法可以通过关联(has_many 等)调用以自动链接两个模型。
【讨论】:
虽然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 是 new 和 save 的较短版本。 #创建!如果验证不是肯定的,则抛出异常。
【讨论】:
我会支持上述答案。另外对于create,不能将false 作为参数传递,而save 则可以这样做。将 false 作为参数传递将跳过所有 Rails 验证
【讨论】: