2016-10-21 2 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이 아니라는 것입니다.

관련 문제