2016-10-21 32 views
0

@user更新其電子郵件屬性並始終以激活鏈接工作時,會發送第一封驗證電子郵件。用戶檢查他們的電子郵件,點擊鏈接,並驗證帳戶。爲什麼我的第二個驗證電子郵件沒有工作?

def update 
    @user = User.find(params[:id]) 
    ... 
    elsif !params[:user][:email].blank? 
     if @user.authenticate(params[:user][:current_password]) 
     @user.update_attributes(email_user_params) 
     if @user.save 
      @user.create_activation_digest 
      @user.deactivated 
      @user.send_activation_email 
      log_out 
      flash[:info] = "Please check email dude" 
      redirect_to root_url 
     else 
    ... 

然而,當@user要求二次確認電子郵件:

class EmailResetsController < ApplicationController 
    def new 
    end 

    def create 
     @user = User.find_by(email: params[:email_reset][:email].downcase) 
     if @user && [email protected]? 
     @user.send_activation_email 
     flash[:info] = "Email sent with instructions" 
     redirect_to root_url 
     else 
     flash.now[:danger] = "Email address not found" 
     render 'new' 
     end 
    end 
end 

的電子郵件被正確地發送出去,但該鏈接總是返回無效。

user.rb 

#sends out email 
def send_activation_email 
    UserMailer.account_activation(self).deliver_now 
end 

def create_activation_digest 
    self.activation_token = User.new_token 
    self.activation_digest = User.digest(activation_token) 
end 

def User.digest(string) 
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 
               BCrypt::Engine.cost 
    BCrypt::Password.create(string, cost: cost) 
end  

# Returns a random token. 
def User.new_token 
    SecureRandom.urlsafe_base64 
end 

def authenticated?(attribute, token) 
    digest = send("#{attribute}_digest") 
    return false if digest.nil? 
    BCrypt::Password.new(digest).is_password?(token) 
end 

#the mailer view 
account_activation.html.erb 
    <%= link_to "Activate", edit_account_activation_url(@user.activation_token, 
               email: @user.email) %> 

class UserMailer < ApplicationMailer 
    default from: "[email protected]" 

    def account_activation(user) 
    @user = user 
    mail to: user.email, subject: "Account activation" 
    end 
end 

class AccountActivationsController < ApplicationController 

    def edit 
    user = User.find_by(email: params[:email]) 
    if user && !user.activated? && user.authenticated?(:activation, params[:id]) 
     user.activate 
     log_in user 
     flash[:success] = "Account activated!" 
     redirect_to user 
    else 
     flash[:danger] = "Invalid activation link" 
     redirect_to root_url 
    end 
    end 
end 


:activation_token and :activation_digest are both columns in user.rb 

回答

1

好的,我解決了這個問題。問題是EmailResetsController通過:email找到用戶,而不是:id

相關問題