2016-10-21 2 views
0

@userが電子メール属性を更新すると、最初の検証電子メールが送信され、常に有効なアクティベーションリンクが確立されます。ユーザーは自分の電子メールを確認し、リンクをクリックして、アカウントが検証されます。私の2番目の検証電子メールはなぜ機能しないのですか?

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でないことです。

関連する問題