我需要修改Devise如何确定用户帐户是否已确认。
我已设置两步注册,用户输入电子邮件,然后在点击其电子邮件中的链接后设置密码。
这很好但我有一个场景,登录用户可以创建用户并向他们发送链接以确认他们的帐户。这是通过自定义邮件程序手动发送的(这包括请求其帐户的用户的电子邮件地址以及confirmation_token),这意味着如果用户的帐户是通过其他用户创建的,则用户将收到2封电子邮件,标准设计确认_指令和自定义邮件'邀请'。
在此之后我设置了skip_confirmation!在保存之前,这意味着只有我发送的电子邮件才会收到用户,但由于这会设置confimed_at字段,因此用户无法设置密码,因为它会生成错误,说明帐户已经确认。
如何更改确认?还检查密码是否为空的方法?
这是我的2步注册过程的覆盖确认控制器:
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
.
.
.
答案 0 :(得分:0)
所以我已经破解了这个,并设法让这个工作,所以我想分享我是如何到达那里的。
所以要求是:
1)用户从注册页面注册,发送确认的电子邮件是标准的confirm_instructions设计电子邮件。
2)用户是由另一个用户创建的,发送的电子邮件是一封自定义邮件,其中包含发件人的创建者用户名。
我对上面的内容进行了以下更改以使其正常工作:
在User表中添加了列:invite:Integer
在用户模型中添加了以下内容:
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
在登录用户创建用户的控制器中更改为
.
.
.
newContact = User.create(:email => params[:contact_email], :invited => 1)
if newContact.save
MyMailer.invite(current_user, newContact).deliver
.
.
.
end
.
.
.
还在ConfirmationsController中添加了以下内容,以处理用户再次点击确认链接的可能性。
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
我确信有更好的方法,但这适用于我们需要的东西。如果有人想建议一个更好的方式,那么无论如何都要成为我的客人。