Удаление аргумента из вызова метода Ruby в корне класса. На лету

#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 !