Модифицировать 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.