2016-10-21 12 views
1

私がUserControllerに、以下に示す更新アクションが完了すると、ユーザがroot_urlその後、ページがリダイレクトされた後にattr_accessor = nilですか?

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 
      flash[:danger] = "Email Update Failed" 
      redirect_to edit_user_email_path(@user) 
     end 
    else 
     flash[:danger] = "Current Password Is Incorrect" 
     redirect_to edit_user_email_path(@user) 
    end 
    ... 

def edit 
    @user = User.find(params[:id]) 
end  

にリダイレクトされたら、私はAccount Activation

user.rb 
attr_accessor :activation_token 

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

ためHARTLのチュートリアルを使用しています:

:activation_token = nil。

これは間違いありませんか?

別のコントローラーアクションでユーザーが2回目の検証電子メールをリクエストできるようにするという話題には、bunchというトピックがありますので、質問しています。これらのトピックすべてでは、それが送信され、:activation_token:idとして使用され、エラー・メッセージがアップします:id -> nil

編集:

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 

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

クラスAccountActivationsController < ApplicationControllerに

+0

あなたは 'edit'ユーザコントローラアクションを表示できますか? –

+0

私はそれを質問に加えました。ありがとう。 –

+0

実際には、私はこれが 'edit_user_email_path'に行くことを意味して申し訳ありません –

答えて

0

したがって、オブジェクトがスコープを離れてリロードされているか、コンテキストが緩んでいるような場合でも、そのトークンを格納するために仮想属性を使用しているようです。最適なのは、Userテーブルへの列を広告に貼り付けるだけで、コンテキスト間でそれを保持し、必要に応じて更新することです。

+0

activation_tokenをユーザーモデルに格納する際にセキュリティ上の問題はありますか? –

+1

トーキーを使用してアカウントを有効にするだけの場合は、データベースに格納する際のリスクはそれほどありません。私はあなたが熟練しているかどうかはわかりませんが、ユーザーモデルのデータベースにパスワードリセットトークンを格納しています。 「彼ら」がすでにデータベースに遠く離れていて構造化クエリを実行でき、アクティベーションリンクを再構築するためにアプリを理解している場合は、より大きな問題があります。 –

関連する問題