Модифицировать Devise подтвердили? включить password.blank?

Мне нужно изменить, как Devise решает, подтверждена ли учетная запись пользователя.

Я установил двухэтапную регистрацию, где пользователь вводит электронное письмо, затем устанавливает свой пароль после нажатия на ссылку в своем электронном письме.

Это работает нормально, но у меня есть сценарий, когда вошедший в систему пользователь может создать пользователя и отправить ему ссылку для подтверждения его учетной записи. Он отправляется вручную через пользовательскую почтовую программу (в том числе адрес электронной почты пользователя, который запросил свою учетную запись, а также response_token), что означает, что пользователь получает 2 сообщения электронной почты, если его учетная запись создается через другого пользователя, стандартное устройство devise verify_instructions и Пользовательская почта "Пригласить".

После этого я установил skip_confirmation! перед сохранением, которое означает, что только электронное письмо, которое я отправляю, получает пользователю, но так как это устанавливает поле confimed_at, пользователь не может установить свой пароль, поскольку это генерирует ошибку, говоря, что учетная запись уже подтверждена.

Как я могу изменить подтвержденный? способ также проверить, что пароль не является нулевым?

Вот мой переопределенный контроллер подтверждений для моего двухэтапного процесса регистрации:

class ConfirmationsController < Devise::ConfirmationsController
  def show
    self.resource = resource_class.find_by_confirmation_token(params[:confirmation_token])
    super if resource.confirmed? 
  end

  def confirm
    self.resource = resource_class.find_by_confirmation_token(params[resource_name][:confirmation_token])
    if resource.update_attributes(params[resource_name].except(:confirmation_token)) && resource.password_match?
      self.resource = resource_class.confirm_by_token(params[resource_name][:confirmation_token])
      set_flash_message :notice, :confirmed
      sign_in_and_redirect(resource_name, resource)
    else
      render :action => "show"
    end
  end
end

Вот пользовательский почтовик:

class MyMailer < Devise::Mailer   
  helper :application # gives access to all helpers defined within `application_helper`.


   def invite(sender, recipient)
        @sender = sender
        @recipient = recipient

        mail( :to => recipient.email,
              :subject => "Account created by #{sender.email}",
              :from => "noreply@noreply.com"
            )
  end

end

код в контроллере, в котором вошедший в систему пользователь создает нового пользователя (показан соответствующий раздел)

.
.
.
            newContact = User.create(:email => params[:contact_email])
            newContact.skip_confirmation!
            if newContact.save
                 MyMailer.invite(current_user, newContact).deliver
                 .
                 .
                 .
             end
.
.
.

1 ответ

Так что я взломал это и сумел заставить это работать, поэтому думал, что поделюсь, как я туда попал.

Итак, требование было:

1) пользователь регистрируется со страницы регистрации, электронное письмо, отправленное для подтверждения, является стандартным электронным письмом с подтверждением.

2) пользователь создан другим пользователем, отправленная электронная почта - это пользовательская почта, содержащая имя пользователя создателя отправителю.

Я сделал следующие изменения, чтобы это работало:

Добавлен столбец в таблицу пользователей: приглашения: целое число

В модель пользователя добавлено следующее:

protected
  def send_confirmation_instructions
    if !self.invited.nil?
      self.confirmation_token = nil if reconfirmation_required?
      @reconfirmation_required = false
      generate_confirmation_token! if self.confirmation_token.blank?
    else
      self.confirmation_token = nil if reconfirmation_required?
      @reconfirmation_required = false
      generate_confirmation_token! if self.confirmation_token.blank?
      self.devise_mailer.confirmation_instructions(self).deliver
    end
  end

  def send_on_create_confirmation_instructions
    self.devise_mailer.confirmation_instructions(self).deliver if self.invited.nil?
  end

in the controller where a user is created by a logged in user changed to

.
.
.
            newContact = User.create(:email => params[:contact_email], :invited => 1)
            if newContact.save
                 MyMailer.invite(current_user, newContact).deliver
                 .
                 .
                 .
             end
.
.
.

Also added the following to the ConfirmationsController to deal with the possibility of users clicking the confirmation link again.

  def show
    self.resource = resource_class.find_by_confirmation_token(params[:confirmation_token])
    if self.resource.nil?
      redirect_to new_user_session_path, :notice => 'This link is no longer active, please sigin in or request new password'
    else
      super if resource.confirmed?
    end
  end

I am sure there is a better way but this works for what we need. if anyone want to suggest a better way then by all means be my guest.

Другие вопросы по тегам