Есть ли способ в Rails, чтобы сказать "запустить все проверки, КРОМЕ: пароль"? - PullRequest
2 голосов
/ 24 мая 2011

Я использую 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 и просто сделать все это с нуля. Таким образом, ваше приложение полностью контролирует, как все это работает: (

1 Ответ

0 голосов
/ 24 мая 2011

Я недавно начал использовать это замечательное дополнение devise: devise_invitable

Обычно оно используется, чтобы пользователи (или любая модель) могли приглашать других пользователей присоединиться.

Но я адаптирую его для того, чтобы вручную (через панель администратора) приглашать новых потенциальных пользователей в мое приложение.

Надеюсь, это поможет!

...