在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 表示进行响应。
我正在使用 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 表示进行响应。