Я использую Devise для аутентификации. Если hashed_password
не установлен, для проверки Rails / Devise потребуется установить пароль, а также password_confirmation
.
Когда я приглашаю новых пользователей, я, очевидно, не хочу устанавливать их пароль, поэтому, когда я создаю приглашение в моей системе, оно терпит неудачу, потому что user.password
пусто.
Я могу установить временный hashed_password
для пользователя, но когда они вводят свой собственный пароль, проверки для :password
и :password_confirmation
не произойдет, потому что установлен hashed_password
, что является реальной проблемой.
Есть ли способ сообщить Rails, что я хочу запустить все проверки, кроме тех, которые связаны с :password
?
Я знаю, что в Rails есть условия :if
, которые могут решить мою проблему, но Devise объявляет проверку :password
от моего имени, так что по сути это скрыто.
Как я могу получить желаемый результат здесь? Надеюсь, что это не взлом.
Мое нынешнее гипотетическое решение, которое несколько запутанно: единственное, о чем я могу подумать, - это создать новую модель Приглашения, которая не является моделью Пользователя, и использовать модель Приглашения для формы. Когда приглашение отправлено, я могу проверить это приглашение и скопировать все значения в новую модель пользователя. Я могу сохранить этого пользователя без каких-либо проверок вообще.
Это лучшее решение, которое я придумал.
Похоже, мое решение будет намного больше работы, чем просто сказать что-то вроде:
user.save(validations => {:except => :password})
РЕДАКТИРОВАТЬ: Я нашел одну часть решения, но у меня все еще есть проблемы. В нашей пользовательской модели мы можем переопределить метод Devise, чтобы предотвратить проверку пароля для приглашений с этим битом кода:
#protected
def password_required?
!is_invited && super
end
Атрибут is_invited
- это просто столбец, который я добавил в таблицу / модель users
.
Однако здесь есть одна ошибка. Когда пользователь принимает приглашение, и он приходит в форму, где ему нужно установить пароль / подтверждение_ пароля, valid?
будет всегда возвращать true
.
Это меня глубоко озадачило. Я не понимаю, как requires_password?
и valid?
могут быть правдой одновременно. Если для этого требуется пароль, он должен выполнить проверку и вызвать сбой проверки.
Я начинаю ненавидеть Devise - или просто идею использования гемов для создания частей вашего приложения в черном ящике. Я думаю, что реальное решение, вероятно, состоит в том, чтобы вырвать Devise и просто сделать все это с нуля. Таким образом, ваше приложение полностью контролирует, как все это работает: (