Таблица моих пользователей имеет уникальные индексы в полях электронной почты и имени пользователя. Время от времени ограничение единственности будет нарушено, и будет выбрано исключение ActiveRecord::RecordNotUnique
. Это может произойти из-за состояния гонки в проверке уникальности рельсов, когда пользователь дважды отправляет регистрационную форму в быстрой последовательности или когда два пользователя пытаются зарегистрировать одно и то же имя пользователя одновременно.Ручка ActiveRecord :: RecordNotUnique в контроллере регистрации Devise
Когда исключение вызвано двумя последовательными запросами на регистрацию, я хотел бы подписать пользователя. В противном случае, когда ограничение уникальности нарушено редким случаем двух пользователей, регистрирующих одно и то же имя пользователя, я бы хотел отобразить обычная «взятая» ошибка.
Для этого я переопределить действие создания:
class RegistrationsController < Devise::RegistrationsController
def create
begin
super
rescue ActiveRecord::RecordNotUnique
user = User.find_by_email(params[:user][:email])
if user.present? && user.valid_password?(params[:user][:password])
# The credentials are valid for the existing user. We can
# sign them in.
sign_in(:user, user)
respond_with user, :location => after_sign_in_path_for(user)
else
# The credentials are invalid.
# This should only happen if multiple users register with the
# same email at the same time. Now we can simply attempt to
# register the user again, knowing it will fail, in order to
# generate the appropriate error messages.
super
end
end
end
end
Есть ли способ сделать Разрабатывает обрабатывать ActiveRecord::RecordNotUnique
исключения и добиться чего-то подобного тому, что я сделал?
Какая версия Devise вы используете? – Ashitaka