修改设计确认?包括password.blank?

时间:2012-11-23 17:46:25

标签: ruby-on-rails devise devise-confirmable

我需要修改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
.
.
.

1 个答案:

答案 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

我确信有更好的方法,但这适用于我们需要的东西。如果有人想建议一个更好的方式,那么无论如何都要成为我的客人。