Railsチュートリアル勉強中の者です。
「送られてきたメール内のリンクをクリックすることで、アカウントを有効化する」
という機能を作成しておりますが、うまく機能を実装できませんでした。
下記の通り試して見たのですが、解決することができません。
ヒントや解決策をご教示いただけますと幸いです。
###困っていること
送られてきたメールのリンクをクリックしてもアカウントの有効化が成功しなかった。
原因を調べてみると、アカウントが最初から有効化された状態で登録されていた。
###試したこと
アカウントが最初から有効化されていることに気づいたため、
usersテーブルのactivated属性のデフォルトを、falseに設定して、$ rails db:migrate
しました。
→こちらを試した後、新しいアカウントを作成し、
送られてきたメールのリンクをクリックして有効化を試みましたが、失敗しました。
再度調べてみると、新しいアカウントもメール内のリンクをクリックする前から有効化されていました。
###下記は原因があると考えたコードでございます。(最初の行にコメントでどういった意味でコードを書いたか記入しました)
#usersテーブルのactivated属性のデフォルトをfalseに設定しました。 class AddActivationToUsers < ActiveRecord::Migration[6.0] def change add_column :users, :activation_digest, :string add_column :users, :activated, :boolean, default: false add_column :users, :activated_at, :datetime end
#「userが有効化されていない状態」&「ユーザーの有効化トークンと有効化ダイジェストが一致する状態」であれば、アカウントの有効化が成功する。ということを記述したコードです。 class AccountActivationsController < ApplicationController def edit user = User.find_by(email: params[:email]) if user && !user.activated? && user.authenticated?(:activation, params[:id]) user.update_attribute(:activated, true) user.update_attribute(:activated_at, Time.zone.now) log_in user flash[:success] = "Account activated!" redirect_to user else flash[:danger] = "Invalid activation link" redirect_to root_url end end end
#AccountActivationsControllerに関係するモデルです。authenticated?メソッドの情報が必要かと思い、掲載させていただきました。 class User < ApplicationRecord attr_accessor :remember_token,:activation_token before_save :downcase_email before_create :create_activation_digest validates :name, presence: true, length: { maximum: 50 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(.[a-z\d\-]+)*.[a-z]+\z/i validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: true has_secure_password validates :password, presence: true, length: { minimum: 6 },allow_nil: true # 渡された文字列のハッシュ値を返す def User.digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end # ランダムなトークンを返す def User.new_token SecureRandom.urlsafe_base64 end # 永続セッションのためにユーザーをデータベースに記憶する def remember self.remember_token = User.new_token update_attribute(:remember_digest, User.digest(remember_token)) end # 渡されたトークンがダイジェストと一致したらtrueを返す def authenticated?(attribute, token) digest = send("#{attribute}_digest") return false if digest.nil? BCrypt::Password.new(digest).is_password?(token) end def forget update_attribute(:remember_digest, nil) end def activate update_attribute(:activated, true) update_attribute(:activated_at, Time.zone.now) end # 有効化用のメールを送信する def send_activation_email UserMailer.account_activation(self).deliver_now end private # メールアドレスをすべて小文字にする def downcase_email self.email = email.downcase end # 有効化トークンとダイジェストを作成および代入する def create_activation_digest self.activation_token = User.new_token self.activation_digest = User.digest(activation_token) end end
以上でございます。
恐れ入りますが、ご確認の程よろしくお願いいたします。
#追記事項
###詳細な手順
1,こちらののトップページから「sign up now!」をクリック
2,メール内のリンクをクリック
3,有効化が成功すると、「Account Activated!」と表示されるはずですが、こちらの画像のような表示になってしまう。
しかし、新しいユーザーはしっかりと登録されている。
あなたの回答
tips
プレビュー