为什么在Rails控制器中验证失败后对象ID会更改?

时间:2018-08-05 14:59:38

标签: ruby-on-rails ruby ruby-on-rails-5

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

我故意将名称留空,并尝试提交表单。会出现通常的错误,但是每次我提交表单时,@ user的对象ID都会更改。有人可以解释一下object_id为何更改吗?我的假设是@user仍然是同一对象(因为我们位于同一页面,因此仅添加错误并在更新失败时重新呈现edit.html.erb)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可能对以下事实感到困惑,即render :edit方法中的update仅呈现edit模板,但不重定向到edit页面-正确

但是,实际上这是您所遇到的情况:

    进入
  • edit页面,在@user的{​​{1}}方法中分配了edit
  • 提交表单,调用UsersController操作,发现在update方法中分配了@user并呈现update模板

因此,在提交表单时会调用其他方法,并且状态会改变