2016-09-19 120 views
0

我系统中的用户需要具有唯一的电子邮件。如果我尝试使用现有电子邮件创建用户,则控制器将引发错误并将回滚所有更改。验证失败后更新模型

我想更新一个模型记录,如果一个愚蠢的电子邮件尝试。但是回滚会阻止任何更改发生,即使它在不同的记录中。我试过update_attribute,update_columnsave(validate: false)但他们都没有工作。

如何绕过回滚并对某个(单独的)模型进行一些编辑?

+0

你想更新什么时候?如果电子邮件是必需/唯一的,但是它不能唯一,我无法想象如何实际创建新记录。但我可以想出一种可能用于更新现有记录的方法。您可以使用模型的错误对象来检查电子邮件验证是否失败,然后在单独的请求中更新模型。例如,您可以使用person.errors [:email]'来检查person的email属性的错误,并且如果有更新(例如)该人的email_error属性。 –

+0

你试过保存(验证:false)吗?不保存(验证:false)。 – YTorii

+0

理想情况下,它发生在相同的请求。我会编辑现有的记录而不是创建一个新的记录。回滚似乎回滚请求期间所做的任何更改。但在这一点上我会解决任何解决方案。 – Dty

回答

1

在我的情况下,after_rollback有窍门。

after_rollback回调期间,我检查是否存在带有电子邮件的用户。如果是这样,我认为回滚是由于电子邮件验证失败,然后更新相应的记录。

+0

我还没有看到after_rollback回调。整齐。我认为你仍然可以在回调中使用错误对象,例如'person.errors [:email]'来真正检查这个人是否有一个愚蠢的电子邮件错误(而不是再次查询你的数据库中的匹配电子邮件),但我不不知道它是否会实际上有所作为。 –

+0

我一直在使用rails 4年,这也是我第一次看到它。打电话给'person.errors',绝对是一个更好的主意。在我的情况下,我更新原始记录的元数据,但检查'person.errors'更清晰。 – Dty

0

如何使用on::创建电子邮件验证选项?使用此选项,验证仅在创建时执行,并跳过更新。

validates :email, uniqueness: true, on: :create 
+0

谢谢,但也许我不够清楚。这不会解决我的问题。我正在尝试在验证失败期间进行更新,但更改并未执行。 – Dty