Ruby on rails 为什么在rails控制器中验证失败后对象id会更改?

Ruby on rails 为什么在rails控制器中验证失败后对象id会更改?,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,我已经使用脚手架生成了一个简单的rails应用程序。在用户模型中,我为name的存在添加了一个验证。我正在使用debug(@user.object_id)并显示在edit.html.erb中我的用户编辑页面顶部 我故意把名字留空,并试图提交表格。通常会出现错误,但每次提交表单时,@user的对象id都会更改。有人能解释一下为什么对象id在变化吗?我的假设是@user仍然是同一个对象(因为我们在同一个页面中,只是添加了错误并在更新失败时重新呈现edit.html.erb)不,您的假设是不正确的。H

我已经使用脚手架生成了一个简单的rails应用程序。在用户模型中,我为name的存在添加了一个验证。我正在使用debug(@user.object_id)并显示在edit.html.erb中我的用户编辑页面顶部


我故意把名字留空,并试图提交表格。通常会出现错误,但每次提交表单时,@user的对象id都会更改。有人能解释一下为什么对象id在变化吗?我的假设是@user仍然是同一个对象(因为我们在同一个页面中,只是添加了错误并在更新失败时重新呈现edit.html.erb)

不,您的假设是不正确的。HTTP调用是无状态的,这意味着调用之间的状态不会持久(即每个调用彼此独立)。每次提交表单时,都会创建一个新对象并将其分配给变量
@user
。由于在每次调用期间都会创建一个新的(不同的)对象,因此它们的
对象id将不同。

您可能会被以下事实弄糊涂:
update
方法中的
render:edit
只会呈现
edit
模板,而不会重定向到
edit
页面-没错

但是,实际上,在您的场景中会发生这样的情况:

  • 编辑
    页面被访问,
    用户控制器
  • 提交表单时,调用并找到
    更新
    操作
    @用户
    更新
    方法中分配,并呈现
    编辑
    模板

因此,在提交表单时会调用不同的方法,并且状态会发生变化

您已经成为会员7年了,但今天刚刚问了您的第一个问题?!?迷人的!您能包括导致问题的代码吗?理想情况下,我们应该在受影响的代码路径中看到任何代码,而不是您验证过的没有导致问题的代码。感谢您的逐步解释