在Rails 5中,"model.save"和"model.errors.empty?"在功能上有区别吗?

In Rails 5, is there a functional difference between "model.save" and "model.errors.empty?"?

我正在使用 Rails 5. 我的控制器中有这个逻辑 ...

@user = UserService.create_user(params)
if @user.errors.empty?
  render :create, :status => :ok

以上和

有什么区别吗
@user = UserService.create_user(params)
if @user.save
  render :create, :status => :ok

我正在决定是使用“.save”还是“.errors.empty?”逻辑。

两者都是劣等的做法:

@user = UserService.build_user(params) # just instanciate the record
if @user.save
   # ...
else
   # ...
end

功能上有区别吗?是的。 .save 触发模型上与保存记录相关的所有回调,这可能会产生副作用。如果您只想检查它是否已保存,请使用 .persisted?.errors.empty? 是对 .valid? 的拙劣模仿。

两者都不会炸毁任何东西,但它仍然让我烦恼,因为它让你的意图变得不那么清晰。如果您执行以下操作,它还会创建两个查询(并触发更新回调):

@user = UserService.create_user(params)
@user.foo = bar
if @user.save
   # ...
else
   # ...
end

当您想将参数与来自会话等其他地方的信息合并时,这很常见。

render :create, status: :ok 也很奇怪。通常你只想重定向到新创建的资源,因为它会颠簸历史,以便浏览器实际上返回到正确的页面而不是 /users 如果用户点击后退按钮。对于 api,您可以使用资源的 status: :created, location: @user 或 JSON 表示进行响应。