Ruby on rails 验证失败后更新模型

Ruby on rails 验证失败后更新模型,ruby-on-rails,ruby,Ruby On Rails,Ruby,我的系统中的用户需要有唯一的电子邮件。如果我尝试使用现有电子邮件创建用户,控制器将抛出错误并回滚任何更改 如果进行了重复电子邮件尝试,我想更新模型记录。但是回滚阻止了任何变化的发生,即使它位于不同的记录中。我尝试了update\u属性,update\u列和save(validate:false),但都不起作用 如何绕过回滚并对(单独的)模型进行一些编辑?如何使用on::create选项进行电子邮件验证?使用此选项,验证仅在“创建”中执行,并在“更新”中跳过 validates :email, u

我的系统中的用户需要有唯一的电子邮件。如果我尝试使用现有电子邮件创建用户,控制器将抛出错误并回滚任何更改

如果进行了重复电子邮件尝试,我想更新模型记录。但是回滚阻止了任何变化的发生,即使它位于不同的记录中。我尝试了
update\u属性
update\u列
save(validate:false)
,但都不起作用


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

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

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

使用on::create选项进行电子邮件验证怎么样?使用此选项,验证仅在“创建”中执行,并在“更新”中跳过

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

在我的例子中,回滚后的
起作用


在回滚后的
回调过程中,我检查有电子邮件的用户是否在场。如果是这样,我假设回滚是由于重复电子邮件验证失败,然后更新相应的记录。

在我的情况下,回滚后的
起作用


在回滚后的
回调过程中,我检查有电子邮件的用户是否在场。如果是这样,我假设回滚是由于重复电子邮件验证失败,然后更新相应的记录。

您想在什么时候更新?如果电子邮件是必需的/唯一的,我无法想象如何实际创建新记录,但它无法实现唯一性。但我可以想出一种方法来更新现有记录。您可以使用模型的errors对象检查电子邮件验证是否失败,然后在单独的请求中更新您的模型。例如,您可以使用
person.errors[:email]
检查person的email属性是否有错误,以及是否有更新(例如)person的email\u error属性。是否尝试保存(验证:false)?不保存(验证:false)。理想情况下,它发生在同一个请求中。我将编辑一个现有的记录,而不是创建一个新的记录。回滚似乎会回滚请求期间所做的任何更改。但我会接受任何解决方案。你想在什么时候更新?如果电子邮件是必需的/唯一的,我无法想象如何实际创建新记录,但它无法实现唯一性。但我可以想出一种方法来更新现有记录。您可以使用模型的errors对象检查电子邮件验证是否失败,然后在单独的请求中更新您的模型。例如,您可以使用
person.errors[:email]
检查person的email属性是否有错误,以及是否有更新(例如)person的email\u error属性。是否尝试保存(验证:false)?不保存(验证:false)。理想情况下,它发生在同一个请求中。我将编辑一个现有的记录,而不是创建一个新的记录。回滚似乎会回滚请求期间所做的任何更改。但我会接受任何解决方案。谢谢,但也许我还不够清楚。这解决不了我的问题。我正在尝试在验证失败期间进行更新,但更改没有坚持。谢谢,但可能我不够清楚。这解决不了我的问题。我正在尝试在验证失败期间进行更新,但更改没有发生。我以前没有看到过after_回滚回调。整洁的我认为您仍然可以在回调中使用errors对象ie
person.errors[:email]
,以实际检查此人是否有重复电子邮件错误(而不是再次查询您的DB以获得匹配的电子邮件)但我不知道这是否真的会有所不同。我已经为rails工作了4年,这也是我第一次看到它。打电话给
人很好。错误
,绝对是个好主意。在我的例子中,我更新了原始记录的元数据,但是检查
person.errors
更清楚。我以前没有看到过after_回滚回调。整洁的我认为您仍然可以在回调中使用errors对象ie
person.errors[:email]
,以实际检查此人是否有重复电子邮件错误(而不是再次查询您的DB以获得匹配的电子邮件)但我不知道这是否真的会有所不同。我已经为rails工作了4年,这也是我第一次看到它。打电话给
人很好。错误
,绝对是个好主意。在我的例子中,我更新了原始记录的元数据,但是检查
person.errors
更清晰。