#ruby-on-rails #ruby #devise
#ruby-on-rails #ruby #разработать
Вопрос:
Вот класс Ruby:
class User
devise :trackable, :confirmable
end
Для большинства экземпляров я хочу :confirmable
присутствовать, но для некоторых экземпляров я хотел бы удалить :confirmable
перед созданием экземпляра.
ВОПРОС: Как удалить :confirmable
на лету?
Я бы предпочел избежать создания отдельного класса.
Ответ №1:
devise :confirmable
добавляет несколько методов в вашу модель, один из которых skip_confirmation!
:
Если вы не хотите, чтобы при создании отправлялось подтверждение, а также не генерировался код, вызовите skip_confirmation !
Пример:
user = User.new
user.skip_confirmation!
Комментарии:
1. это тоже работает вместо user.confirm! , но все равно должно быть связано с настраиваемой логикой «confirmation_required? ()»..
2. Примечание для читателей: skip_confirmation! работает после User.new, но не после User.create (который, я думаю, является своего рода User.new, за которым следует user.save!)
Ответ №2:
Вам понадобятся миграции для обоих: отслеживаемый и: подтверждаемый в любом случае для вашей БД.
Не было бы проще просто определить:confirmable для обоих случаев, но в случае, если вы этого не хотите, вы можете автоматически подтвердить учетную запись пользователя из контроллера после создания пользователя?
см .:
https://github.com/plataformatec/devise/blob/master/lib/devise/models/confirmable.rb
строки 27..30 содержат перехватчики before_create и after_create
вам нужно будет выполнить эту модификацию:
вам нужно переопределить :confirmation_required? , чтобы он возвращал true только в тех случаях, когда вы хотите, чтобы был сгенерирован токен подтверждения и отправлено электронное письмо с подтверждением. В случае, если вам не нужно подтверждение по электронной почте, вы можете выполнить user.confirm! после создания учетной записи пользователя. Вы могли бы ввести это в качестве дополнительного действия after_create .
например
module Devise
module Models
module Confirmable
after_create :confirm! , :if => :confirmation_not_required? # you'll need to define that method
private
def confirmation_required? # overriding the default behavior
your_special_conditions amp;amp; !confirmed?
end
def confirmation_not_required?
! confirmation_required?
end
end
end
end
Примечание:
Вместо user.confirm! вы также можете использовать user.skip_confirmation !