質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

626閲覧

[Railsチュートリアル第6版 11章 アカウントの有効化]メール内のリンクをクリックすることで、アカウントを有効化するという機能が実装できない。

gussan-me

総合スコア7

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/02/08 23:20

編集2021/02/09 00:19

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!」と表示されるはずですが、こちらの画像のような表示になってしまう。
しかし、新しいユーザーはしっかりと登録されている。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/02/09 00:01 編集

無効化した状態で登録しておけば良いと思うのですが、そういうことではなく? defaultをfalseにしてもそれがテーブル定義に反映されてなかったり意図的にtrue入れてたら意味がないです
m.ts10806

2021/02/08 23:51

そもそも「成功しなかった」とは何が起きたのでしょうか。
gussan-me

2021/02/09 00:12 編集

ご確認いただきありがとうございます。 「成功しなかった」ということについて、補足させていただきました。 ご確認いただけますと幸いです。 上記の通り、無効化した状態で登録しているつもりなのですが、 どの点の修正が必要なのでしょうか。。
m.ts10806

2021/02/09 00:14

画像はなるべくteratailの投稿機能で提示してください。「外部リンクを踏む」という抵抗は少なからず生まれますし、何かのときにその外部サービスが止まったときに確認できなくなります
gussan-me

2021/02/09 00:20

失礼しました。 画像を追加しました。 ご確認の程、よろしくお願い申し上げます。
gussan-me

2021/02/09 00:47

申し訳ありません。 この問題を放置してチュートリアルを進めていくと気づいたのですが、 有効化されていると考えていた新規登録ユーザーは、有効化されておりませんでした。 (有効化されていないユーザーはユーザー一覧に表示しないという機能を実装するセクションがあり、発覚しました。) しかし、それならなぜメール内リンクをクリックして有効化に失敗してしまうのか、 原因が余計に分からなくなってしまいました。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問