2016-09-19 3 views
0

Пользователи моей системы должны иметь уникальные электронные письма. Если я попытаюсь создать пользователя с существующим электронным письмом, контроллер выдает ошибку и отменит любые изменения.модель обновления после отказа проверки

Я хочу обновить образцовую запись, если сделана попытка повторного использования электронной почты. Но откат предотвращает любые изменения, даже если он находится в другой записи. Я пробовал update_attribute, update_column и save(validate: false), но никто из них не работает.

Как я могу обойти откат и внести некоторые изменения в (отдельную) модель?

+0

В какой момент вы хотите обновить? Я не могу представить, как создать новую запись, если электронная почта требуется/уникальна, но она не соответствует уникальности. Но я могу придумать способ, который может работать для обновления существующей записи. Вы можете использовать объект ошибок модели, чтобы проверить, не прошла ли проверка электронной почты, а затем обновить модель в отдельном запросе. Например, вы можете использовать 'person.errors [: email]', чтобы проверять наличие ошибок в атрибуте электронной почты человека, и если есть обновление (например) атрибута email_error человека. –

+0

Вы попробовали сохранить (утвердить: false)? Не сохранять (validation: false). – YTorii

+0

В идеале это происходит в том же запросе. Я бы редактировал существующую запись и не создавал новую. Откат, похоже, отменяет любые изменения, сделанные во время запроса. Но сейчас я соглашусь на любое решение. – Dty

ответ

1

В моем случае after_rollback делает трюк.

Во время обратного вызова after_rollback Я проверяю наличие пользователя с электронной почтой. Если это так, я предполагаю, что откат был вызван ошибкой проверки подлинности электронной почты, а затем обновил соответствующую запись.

+0

Я еще не видел обратный вызов after_rollback. Ухоженная. Я думаю, вы все еще можете использовать объект errors, т. Е. 'Person.errors [: email]' внутри обратного вызова, чтобы фактически проверить, что у человека есть ошибка электронной почты об ошибке (вместо того, чтобы снова запрашивать вашу БД для соответствующего письма), но я Не знаю, изменит ли это. –

+0

Я работаю с рельсами в течение 4 лет, и я впервые вижу это. Хороший призыв к 'person.errors', определенно лучшая идея. В моем случае я обновляю метаданные исходной записи, но проверка 'person.errors' намного яснее. – Dty

0

Как насчет использования:: создать параметр для проверки подлинности электронной почты? С помощью этой опции проверка выполняется только при создании и пропусках при обновлении.

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

Спасибо, но, может быть, я недостаточно ясен. Это не решит мою проблему. Я пытаюсь сделать обновление во время сбоя проверки, и это изменение не прилипает. – Dty

Смежные вопросы